Skip to content

Commit

Permalink
Merge pull request #125 from outfoxx/feature/const-hdrs
Browse files Browse the repository at this point in the history
Don’t include constant headers in request method parameters
  • Loading branch information
kdubb authored Dec 22, 2024
2 parents 258221d + 92b8612 commit 794ef2a
Show file tree
Hide file tree
Showing 17 changed files with 490 additions and 181 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ abstract class KotlinGenerator(
typeBuilder: TypeSpec.Builder,
functionBuilder: FunSpec.Builder,
parameterBuilder: ParameterSpec.Builder,
): ParameterSpec
): ParameterSpec?

abstract fun processResourceMethodBodyParameter(
endPoint: EndPoint,
Expand Down Expand Up @@ -569,8 +569,11 @@ abstract class KotlinGenerator(
functionBuilder,
headerParameterBuilder,
)

functionBuilder.addParameter(headerParameterSpec)
if (headerParameterSpec != null) {
functionBuilder.addParameter(headerParameterSpec)
} else if (headerParameterTypeName == headerParameterTypeNameContext.suggestedTypeName) {
typeRegistry.unresolveTypeName(headerParameterTypeName)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,34 +43,7 @@ import io.outfoxx.sunday.generator.common.ShapeIndex
import io.outfoxx.sunday.generator.genError
import io.outfoxx.sunday.generator.kotlin.KotlinTypeRegistry.Option.JacksonAnnotations
import io.outfoxx.sunday.generator.kotlin.utils.*
import io.outfoxx.sunday.generator.utils.api
import io.outfoxx.sunday.generator.utils.defaultValueStr
import io.outfoxx.sunday.generator.utils.equalsInAnyOrder
import io.outfoxx.sunday.generator.utils.findBoolAnnotation
import io.outfoxx.sunday.generator.utils.findStringAnnotation
import io.outfoxx.sunday.generator.utils.findArrayAnnotation
import io.outfoxx.sunday.generator.utils.flattened
import io.outfoxx.sunday.generator.utils.hasAnnotation
import io.outfoxx.sunday.generator.utils.headers
import io.outfoxx.sunday.generator.utils.mediaType
import io.outfoxx.sunday.generator.utils.method
import io.outfoxx.sunday.generator.utils.name
import io.outfoxx.sunday.generator.utils.parameterName
import io.outfoxx.sunday.generator.utils.parent
import io.outfoxx.sunday.generator.utils.path
import io.outfoxx.sunday.generator.utils.payloads
import io.outfoxx.sunday.generator.utils.queryParameters
import io.outfoxx.sunday.generator.utils.request
import io.outfoxx.sunday.generator.utils.requests
import io.outfoxx.sunday.generator.utils.required
import io.outfoxx.sunday.generator.utils.scalarValue
import io.outfoxx.sunday.generator.utils.schema
import io.outfoxx.sunday.generator.utils.scheme
import io.outfoxx.sunday.generator.utils.schemes
import io.outfoxx.sunday.generator.utils.security
import io.outfoxx.sunday.generator.utils.statusCode
import io.outfoxx.sunday.generator.utils.successes
import io.outfoxx.sunday.generator.utils.stringValue
import io.outfoxx.sunday.generator.utils.*
import java.net.URI
import kotlin.collections.set

Expand Down Expand Up @@ -515,7 +488,23 @@ class KotlinJAXRSGenerator(
typeBuilder: TypeSpec.Builder,
functionBuilder: FunSpec.Builder,
parameterBuilder: ParameterSpec.Builder,
): ParameterSpec {
): ParameterSpec? {

val isConstant = parameter.required == true && parameter.schema?.values?.size == 1
if (isConstant) {
val clientHeaderParam = jaxRsTypes.clientHeaderParam
if (generationMode == Client && clientHeaderParam != null) {
functionBuilder.addAnnotation(
AnnotationSpec.builder(clientHeaderParam)
.addMember("name = %S", parameter.name())
.addMember("value = %S", parameter.schema?.values?.first()?.scalarValue?.toString() ?: "")
.build(),
)
return null
} else if (generationMode == Server) {
return null
}
}

// Add @HeaderParam to URI parameters
parameterBuilder.annotateParameter(parameter, JaxRsTypes.ParamType.HEADER, true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,25 +24,14 @@ import amf.core.client.platform.model.document.Document
import amf.core.client.platform.model.domain.Shape
import amf.shapes.client.platform.model.domain.NodeShape
import amf.shapes.client.platform.model.domain.UnionShape
import com.squareup.kotlinpoet.ClassName
import com.squareup.kotlinpoet.CodeBlock
import com.squareup.kotlinpoet.FunSpec
import com.squareup.kotlinpoet.KModifier
import com.squareup.kotlinpoet.*
import com.squareup.kotlinpoet.KModifier.PUBLIC
import com.squareup.kotlinpoet.LIST
import com.squareup.kotlinpoet.MemberName
import com.squareup.kotlinpoet.NameAllocator
import com.squareup.kotlinpoet.ParameterSpec
import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
import com.squareup.kotlinpoet.PropertySpec
import com.squareup.kotlinpoet.TypeName
import com.squareup.kotlinpoet.TypeSpec
import com.squareup.kotlinpoet.UNIT
import com.squareup.kotlinpoet.joinToCode
import io.outfoxx.sunday.generator.APIAnnotationName
import io.outfoxx.sunday.generator.APIAnnotationName.RequestOnly
import io.outfoxx.sunday.generator.APIAnnotationName.ResponseOnly
import io.outfoxx.sunday.generator.GenerationMode
import io.outfoxx.sunday.generator.GenerationMode.Server
import io.outfoxx.sunday.generator.ProblemTypeDefinition
import io.outfoxx.sunday.generator.common.ShapeIndex
import io.outfoxx.sunday.generator.genError
Expand All @@ -56,18 +45,7 @@ import io.outfoxx.sunday.generator.kotlin.utils.SUNDAY_RESPONSE
import io.outfoxx.sunday.generator.kotlin.utils.SUNDAY_RESULT_RESPONSE
import io.outfoxx.sunday.generator.kotlin.utils.URI_TEMPLATE
import io.outfoxx.sunday.generator.kotlin.utils.kotlinConstant
import io.outfoxx.sunday.generator.utils.discriminatorValue
import io.outfoxx.sunday.generator.utils.findBoolAnnotation
import io.outfoxx.sunday.generator.utils.findStringAnnotation
import io.outfoxx.sunday.generator.utils.flattened
import io.outfoxx.sunday.generator.utils.hasAnnotation
import io.outfoxx.sunday.generator.utils.mediaType
import io.outfoxx.sunday.generator.utils.method
import io.outfoxx.sunday.generator.utils.name
import io.outfoxx.sunday.generator.utils.path
import io.outfoxx.sunday.generator.utils.payloads
import io.outfoxx.sunday.generator.utils.request
import io.outfoxx.sunday.generator.utils.requests
import io.outfoxx.sunday.generator.utils.*
import java.net.URI

class KotlinSundayGenerator(
Expand Down Expand Up @@ -352,13 +330,15 @@ class KotlinSundayGenerator(
typeBuilder: TypeSpec.Builder,
functionBuilder: FunSpec.Builder,
parameterBuilder: ParameterSpec.Builder,
): ParameterSpec {
): ParameterSpec? {

val isConstant = parameter.required == true && parameter.schema?.values?.size == 1

val parameterSpec = methodParameter(parameterBuilder)

headerParameters.add(parameter to parameterSpec.type)

return parameterSpec
return if (!isConstant) parameterSpec else null
}

override fun processResourceMethodBodyParameter(
Expand Down Expand Up @@ -409,7 +389,17 @@ class KotlinSundayGenerator(
val origName = param.name!!
val paramName = functionBuilderNameAllocator[param]

parametersBlock.add("%S to %L", origName, paramName)
val (paramValue, argType) =
if (paramName !in functionBuilder.parameters.map { it.name }) {
val schema = param.schema ?: genError("Constant parameter has no schema", param)
val value = schema.values.firstOrNull() ?: genError("Constant parameter has no value", param)
val scalarValue = value.scalarValue?.toString() ?: genError("Constant parameter has no scalar value", param)
scalarValue to "S"
} else {
paramName to "N"
}

parametersBlock.add("%S to %$argType", origName, paramValue)

if (idx < parameters.size - 1) {
parametersBlock.add(",\n")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,10 @@ class KotlinTypeRegistry(
return typeName
}

fun unresolveTypeName(typeName: TypeName) {
typeBuilders.remove(typeName)
}

fun addServiceType(className: ClassName, serviceType: TypeSpec.Builder) {

serviceType
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,6 @@ interface JaxRsTypes {
val sse: ClassName
val sseEventSink: ClassName

// Related Types (SSE)

// Related Types (SSE)
val sseInboundEvent: ClassName
val sseOutboundEvent: ClassName
Expand All @@ -122,6 +120,9 @@ interface JaxRsTypes {
val cache: ClassName? get() = null
val dateFormat: ClassName? get() = null

// Client Only
val clientHeaderParam: ClassName? get() = null

fun httpMethod(method: String): ClassName? =
try {
httpMethod(Method.valueOf(method.uppercase()))
Expand Down Expand Up @@ -285,5 +286,7 @@ interface JaxRsTypes {
override val responseHeader = ClassName(pkg, "ResponseHeader")
override val cache = ClassName(pkg, "Cache")
override val dateFormat = ClassName(pkg, "DateFormat")

override val clientHeaderParam = ClassName("org.eclipse.microprofile.rest.client.annotation", "ClientHeaderParam")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ abstract class SwiftGenerator(
typeBuilder: TypeSpec.Builder,
functionBuilder: FunctionSpec.Builder,
parameterBuilder: ParameterSpec.Builder,
): ParameterSpec
): ParameterSpec?

abstract fun processResourceMethodBodyParameter(
endPoint: EndPoint,
Expand Down Expand Up @@ -529,8 +529,11 @@ abstract class SwiftGenerator(
functionBuilder,
headerParameterBuilder,
)

functionBuilder.addParameter(headerParameterSpec)
if (headerParameterSpec != null) {
functionBuilder.addParameter(headerParameterSpec)
} else if (headerParameterTypeName == headerParameterTypeNameContext.suggestedTypeName) {
typeRegistry.unresolveTypeName(headerParameterTypeName)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,58 +25,17 @@ import amf.core.client.platform.model.domain.Shape
import amf.shapes.client.platform.model.domain.NodeShape
import amf.shapes.client.platform.model.domain.UnionShape
import io.outfoxx.sunday.generator.APIAnnotationName
import io.outfoxx.sunday.generator.APIAnnotationName.Nullify
import io.outfoxx.sunday.generator.APIAnnotationName.RequestOnly
import io.outfoxx.sunday.generator.APIAnnotationName.ResponseOnly
import io.outfoxx.sunday.generator.APIAnnotationName.*
import io.outfoxx.sunday.generator.Generator
import io.outfoxx.sunday.generator.ProblemTypeDefinition
import io.outfoxx.sunday.generator.common.APIAnnotations.groupNullifyIntoStatusesAndProblems
import io.outfoxx.sunday.generator.common.ShapeIndex
import io.outfoxx.sunday.generator.genError
import io.outfoxx.sunday.generator.swift.utils.ANY_VALUE
import io.outfoxx.sunday.generator.swift.utils.ASYNC_STREAM
import io.outfoxx.sunday.generator.swift.utils.DATA_RESPONSE
import io.outfoxx.sunday.generator.swift.utils.DICTIONARY_STRING_ANY
import io.outfoxx.sunday.generator.swift.utils.DICTIONARY_STRING_ANY_OPTIONAL
import io.outfoxx.sunday.generator.swift.utils.EMPTY
import io.outfoxx.sunday.generator.swift.utils.EVENT_SOURCE
import io.outfoxx.sunday.generator.swift.utils.MEDIA_TYPE_ARRAY
import io.outfoxx.sunday.generator.swift.utils.REQUEST_FACTORY
import io.outfoxx.sunday.generator.swift.utils.RESULT_RESPONSE
import io.outfoxx.sunday.generator.swift.utils.URI_TEMPLATE
import io.outfoxx.sunday.generator.swift.utils.URL_REQUEST
import io.outfoxx.sunday.generator.swift.utils.swiftConstant
import io.outfoxx.sunday.generator.utils.discriminatorValue
import io.outfoxx.sunday.generator.utils.findArrayAnnotation
import io.outfoxx.sunday.generator.utils.findBoolAnnotation
import io.outfoxx.sunday.generator.utils.findStringAnnotation
import io.outfoxx.sunday.generator.utils.flattened
import io.outfoxx.sunday.generator.utils.hasAnnotation
import io.outfoxx.sunday.generator.utils.mediaType
import io.outfoxx.sunday.generator.utils.method
import io.outfoxx.sunday.generator.utils.name
import io.outfoxx.sunday.generator.utils.path
import io.outfoxx.sunday.generator.utils.payloads
import io.outfoxx.sunday.generator.utils.request
import io.outfoxx.sunday.generator.utils.requests
import io.outfoxx.swiftpoet.ANY
import io.outfoxx.swiftpoet.CodeBlock
import io.outfoxx.swiftpoet.DATA
import io.outfoxx.swiftpoet.DICTIONARY
import io.outfoxx.swiftpoet.DeclaredTypeName
import io.outfoxx.swiftpoet.FunctionSpec
import io.outfoxx.sunday.generator.swift.utils.*
import io.outfoxx.sunday.generator.utils.*
import io.outfoxx.swiftpoet.*
import io.outfoxx.swiftpoet.Modifier.PUBLIC
import io.outfoxx.swiftpoet.Modifier.STATIC
import io.outfoxx.swiftpoet.NameAllocator
import io.outfoxx.swiftpoet.ParameterSpec
import io.outfoxx.swiftpoet.ParameterizedTypeName
import io.outfoxx.swiftpoet.PropertySpec
import io.outfoxx.swiftpoet.STRING
import io.outfoxx.swiftpoet.TypeName
import io.outfoxx.swiftpoet.TypeSpec
import io.outfoxx.swiftpoet.VOID
import io.outfoxx.swiftpoet.joinToCode
import io.outfoxx.swiftpoet.parameterizedBy
import java.net.URI

class SwiftSundayGenerator(
Expand Down Expand Up @@ -356,13 +315,15 @@ class SwiftSundayGenerator(
typeBuilder: TypeSpec.Builder,
functionBuilder: FunctionSpec.Builder,
parameterBuilder: ParameterSpec.Builder,
): ParameterSpec {
): ParameterSpec? {

val isConstant = parameter.required == true && parameter.schema?.values?.size == 1

val parameterSpec = methodParameter(parameterBuilder)

headerParameters.add(parameter to parameterSpec.type)

return parameterSpec
return if (!isConstant) parameterSpec else null
}

override fun processResourceMethodBodyParameter(
Expand Down Expand Up @@ -413,7 +374,17 @@ class SwiftSundayGenerator(
val origName = param.name!!
val paramName = functionBuilderNameAllocator[param]

parametersBlock.add("%S: %L", origName, paramName)
val (paramValue, argType) =
if (paramName !in functionBuilder.build().parameters.map { it.parameterName }) {
val schema = param.schema ?: genError("Constant parameter has no schema", param)
val value = schema.values.firstOrNull() ?: genError("Constant parameter has no value", param)
val scalarValue = value.scalarValue?.toString() ?: genError("Constant parameter has no scalar value", param)
scalarValue to "S"
} else {
paramName to "N"
}

parametersBlock.add("%S: %$argType", origName, paramValue)
if (anyOptional) {
parametersBlock.add(" as Any?")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,11 @@ class SwiftTypeRegistry(
return typeName
}

fun unresolveTypeName(typeName: TypeName) {

typeBuilders.remove(typeName)
}

fun getReferenceType(className: TypeName): TypeName? = referenceTypes[className]

fun addServiceType(className: DeclaredTypeName, serviceType: TypeSpec.Builder) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ abstract class TypeScriptGenerator(
typeBuilder: ClassSpec.Builder,
functionBuilder: FunctionSpec.Builder,
parameterBuilder: ParameterSpec.Builder,
): ParameterSpec
): ParameterSpec?

abstract fun processResourceMethodBodyParameter(
endPoint: EndPoint,
Expand Down Expand Up @@ -527,7 +527,11 @@ abstract class TypeScriptGenerator(
headerParameterBuilder,
)

functionBuilder.addParameter(headerParameterSpec)
if (headerParameterSpec != null) {
functionBuilder.addParameter(headerParameterSpec)
} else if (headerParameterTypeName == headerParameterSuggestedTypeName) {
typeRegistry.unresolveTypeName(headerParameterTypeName)
}
}
}

Expand Down
Loading

0 comments on commit 794ef2a

Please sign in to comment.