@@ -10,13 +10,13 @@ import software.amazon.smithy.kotlin.codegen.core.withBlock
1010import software.amazon.smithy.kotlin.codegen.core.withInlineBlock
1111import software.amazon.smithy.kotlin.codegen.lang.KotlinTypes
1212import software.amazon.smithy.kotlin.codegen.model.getTrait
13- import software.amazon.smithy.kotlin.codegen.model.isNumberShape
1413import software.amazon.smithy.model.shapes.OperationShape
1514import software.amazon.smithy.model.traits.AuthTrait
1615import software.amazon.smithy.model.traits.HttpBearerAuthTrait
1716import software.amazon.smithy.model.traits.HttpLabelTrait
1817import software.amazon.smithy.model.traits.HttpQueryTrait
1918import software.amazon.smithy.model.traits.HttpTrait
19+ import software.amazon.smithy.model.traits.TimestampFormatTrait
2020import software.amazon.smithy.utils.AbstractCodeWriter
2121
2222class LoggingWriter (parent : LoggingWriter ? = null ) : AbstractCodeWriter<LoggingWriter>() {
@@ -317,62 +317,66 @@ internal class KtorStubGenerator(
317317
318318 private fun readHttpLabel (shape : OperationShape , writer : KotlinWriter ) {
319319 val inputShape = ctx.model.expectShape(shape.input.get())
320- inputShape.allMembers.forEach { member ->
321- if (! member.value.hasTrait(HttpLabelTrait .ID )) return @forEach
322- val memberName = member.key
323-
324- val targetStringValue = " call.parameters[\" $memberName \" ]"
325- val targetShape = ctx.model.expectShape(member.value.target)
326- writer.writeInline(" $memberName = " )
327- .call {
328- renderCastingPrimitiveFromShapeType(
329- targetStringValue,
330- targetShape.type,
331- writer,
332- " Unsupported type ${member.value.type} for httpLabel" ,
333- )
334- }
335- }
320+ inputShape.allMembers
321+ .filter { member -> member.value.hasTrait(HttpLabelTrait .ID ) }
322+ .forEach { member ->
323+ val memberName = member.key
324+ val memberShape = member.value
325+
326+ val httpLabelVariableName = " call.parameters[\" $memberName \" ]"
327+ val targetShape = ctx.model.expectShape(memberShape.target)
328+ writer.writeInline(" $memberName = " )
329+ .call {
330+ renderCastingPrimitiveFromShapeType(
331+ httpLabelVariableName,
332+ targetShape.type,
333+ writer,
334+ memberShape.getTrait<TimestampFormatTrait >() ? : inputShape.getTrait<TimestampFormatTrait >(),
335+ " Unsupported type ${memberShape.type} for httpLabel" ,
336+ )
337+ }
338+ }
336339 }
337340
338341 private fun readHttpQuery (shape : OperationShape , writer : KotlinWriter ) {
339342 val inputShape = ctx.model.expectShape(shape.input.get())
340- inputShape.allMembers.forEach { member ->
341- if (! member.value.hasTrait(HttpQueryTrait .ID )) return @forEach
342- val memberName = member.key
343- val httpQueryTrait = member.value.getTrait<HttpQueryTrait >()!!
344- val targetStringValue = " call.request.queryParameters[\" ${httpQueryTrait.value} \" ]"
345- val targetShape = ctx.model.expectShape(member.value.target)
346- writer.writeInline(" $memberName = " )
347- .call {
348- when {
349- targetShape.isStringShape ||
350- targetShape.isNumberShape ||
351- targetShape.isBooleanShape ||
352- targetShape.isTimestampShape ->
353- renderCastingPrimitiveFromShapeType(
354- targetStringValue,
343+ inputShape.allMembers
344+ .filter { member -> member.value.hasTrait(HttpQueryTrait .ID ) }
345+ .forEach { member ->
346+ val memberName = member.key
347+ val memberShape = member.value
348+ val httpQueryTrait = memberShape.getTrait<HttpQueryTrait >()!!
349+ val httpQueryVariableName = " call.request.queryParameters[\" ${httpQueryTrait.value} \" ]"
350+ val targetShape = ctx.model.expectShape(memberShape.target)
351+ writer.writeInline(" $memberName = " )
352+ .call {
353+ when {
354+ targetShape.isListShape -> {
355+ val listMemberShape = targetShape.allMembers.values.first()
356+ val listMemberTargetShapeId = ctx.model.expectShape(listMemberShape.target)
357+ val httpQueryListVariableName = " (call.request.queryParameters.getAll(\" ${httpQueryTrait.value} \" ) " +
358+ " ?: call.request.queryParameters.getAll(\" ${httpQueryTrait.value} []\" ) " +
359+ " ?: emptyList())"
360+ writer.withBlock(" $httpQueryListVariableName .mapNotNull{" , " }" ) {
361+ renderCastingPrimitiveFromShapeType(
362+ " it" ,
363+ listMemberTargetShapeId.type,
364+ writer,
365+ listMemberShape.getTrait<TimestampFormatTrait >() ? : targetShape.getTrait<TimestampFormatTrait >(),
366+ " Unsupported type ${memberShape.type} for list in httpLabel" ,
367+ )
368+ }
369+ }
370+ else -> renderCastingPrimitiveFromShapeType(
371+ httpQueryVariableName,
355372 targetShape.type,
356373 writer,
357- " Unsupported type ${member.value.type} for httpQuery" ,
374+ memberShape.getTrait<TimestampFormatTrait >() ? : inputShape.getTrait<TimestampFormatTrait >(),
375+ " Unsupported type ${memberShape.type} for httpQuery" ,
358376 )
359- targetShape.isListShape -> {
360- val listMemberShape = ctx.model.expectShape(targetShape.allMembers.values.first().target)
361- val targetListValue = " (call.request.queryParameters.getAll(\" ${httpQueryTrait.value} \" ) " +
362- " ?: call.request.queryParameters.getAll(\" ${httpQueryTrait.value} []\" ) " +
363- " ?: emptyList())"
364- writer.withBlock(" $targetListValue .mapNotNull{" , " }" ) {
365- renderCastingPrimitiveFromShapeType(
366- " it" ,
367- listMemberShape.type,
368- writer,
369- " Unsupported type ${member.value.type} for list in httpLabel" ,
370- )
371- }
372377 }
373378 }
374- }
375- }
379+ }
376380 }
377381
378382 private fun renderRoutingAuth (w : KotlinWriter , shape : OperationShape ) {
0 commit comments