Skip to content
Open
26 changes: 26 additions & 0 deletions core/src/main/kotlin/com/avsystem/justworks/core/ArrowHelpers.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.avsystem.justworks.core

import arrow.core.Nel
import arrow.core.nonEmptyListOf
import arrow.core.raise.IorRaise
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind.AT_MOST_ONCE
import kotlin.contracts.contract

@OptIn(ExperimentalContracts::class)
context(warnings: IorRaise<Nel<Error>>)
inline fun <Error> ensureOrAccumulate(condition: Boolean, error: () -> Error) {
contract { callsInPlace(error, AT_MOST_ONCE) }
if (!condition) {
warnings.accumulate(nonEmptyListOf(error()))
}
}

@OptIn(ExperimentalContracts::class)
context(warnings: IorRaise<Nel<Error>>)
inline fun <Error, B : Any> ensureNotNullOrAccumulate(value: B?, error: () -> Error) {
contract { callsInPlace(error, AT_MOST_ONCE) }
if (value == null) {
warnings.accumulate(nonEmptyListOf(error()))
}
}
15 changes: 15 additions & 0 deletions core/src/main/kotlin/com/avsystem/justworks/core/Issue.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.avsystem.justworks.core

import arrow.core.Nel
import arrow.core.raise.ExperimentalRaiseAccumulateApi
import arrow.core.raise.IorRaise
import kotlin.contracts.ExperimentalContracts

object Issue {
data class Error(val message: String)

@JvmInline
value class Warning(val message: String)
}

typealias Warnings = IorRaise<Nel<Issue.Warning>>
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class ClientGenerator(
private val apiPackage: String,
private val modelPackage: String,
private val nameRegistry: NameRegistry,
private val classNameLookup: Map<String, ClassName> = emptyMap(),
) {
fun generate(spec: ApiSpec, hasPolymorphicTypes: Boolean = false): List<FileSpec> {
val grouped = spec.endpoints.groupBy { it.tags.firstOrNull() ?: DEFAULT_TAG }
Expand Down Expand Up @@ -100,7 +101,7 @@ class ClientGenerator(
val params = endpoint.parameters.groupBy { it.location }

val pathParams = params[ParameterLocation.PATH].orEmpty().map { param ->
ParameterSpec(param.name.toCamelCase(), TypeMapping.toTypeName(param.schema, modelPackage))
ParameterSpec(param.name.toCamelCase(), TypeMapping.toTypeName(param.schema, modelPackage, classNameLookup))
}

val queryParams = params[ParameterLocation.QUERY].orEmpty().map { param ->
Expand Down Expand Up @@ -129,7 +130,7 @@ class ClientGenerator(
name: String,
required: Boolean,
): ParameterSpec {
val baseType = TypeMapping.toTypeName(typeRef, modelPackage)
val baseType = TypeMapping.toTypeName(typeRef, modelPackage, classNameLookup)

val builder = ParameterSpec.builder(name.toCamelCase(), baseType.copy(nullable = !required))
if (!required) builder.defaultValue("null")
Expand Down Expand Up @@ -207,7 +208,7 @@ class ClientGenerator(
.asSequence()
.filter { it.key.startsWith("2") }
.firstNotNullOfOrNull { it.value.schema }
?.let { successResponse -> TypeMapping.toTypeName(successResponse, modelPackage) }
?.let { successResponse -> TypeMapping.toTypeName(successResponse, modelPackage, classNameLookup) }
?: UNIT

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,10 @@ object CodeGenerator {
modelFiles.forEach { it.writeTo(outputDir) }

val hasPolymorphicTypes = modelFiles.any { it.name == SerializersModuleGenerator.FILE_NAME }
val classNameLookup = ModelGenerator.buildClassNameLookup(spec, modelPackage)

val clientFiles = ClientGenerator(apiPackage, modelPackage, apiRegistry).generate(spec, hasPolymorphicTypes)
val clientFiles = ClientGenerator(apiPackage, modelPackage, apiRegistry, classNameLookup)
.generate(spec, hasPolymorphicTypes)
clientFiles.forEach { it.writeTo(outputDir) }

return Result(modelFiles.size, clientFiles.size)
Expand Down
Loading