@@ -10,6 +10,7 @@ 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
1314import software.amazon.smithy.model.shapes.OperationShape
1415import software.amazon.smithy.model.traits.AuthTrait
1516import software.amazon.smithy.model.traits.HttpBearerAuthTrait
@@ -307,19 +308,60 @@ internal class KtorStubGenerator(
307308 private fun readHttpLabel (shape : OperationShape , writer : KotlinWriter ) {
308309 val inputShape = ctx.model.expectShape(shape.input.get())
309310 inputShape.allMembers.forEach { member ->
310- val memberName = member.key
311311 if (! member.value.hasTrait(HttpLabelTrait .ID )) return @forEach
312- writer.write(" $memberName = call.parameters[#S]" , memberName)
312+ val memberName = member.key
313+
314+ val targetStringValue = " call.parameters[\" $memberName \" ]"
315+ val targetShape = ctx.model.expectShape(member.value.target)
316+ writer.writeInline(" $memberName = " )
317+ .call {
318+ renderCastingPrimitiveFromShapeType(
319+ targetStringValue,
320+ targetShape.type,
321+ writer,
322+ " Unsupported type ${member.value.type} for httpLabel" ,
323+ )
324+ }
313325 }
314326 }
315327
316328 private fun readHttpQuery (shape : OperationShape , writer : KotlinWriter ) {
317329 val inputShape = ctx.model.expectShape(shape.input.get())
318330 inputShape.allMembers.forEach { member ->
319- val memberName = member.key
320331 if (! member.value.hasTrait(HttpQueryTrait .ID )) return @forEach
332+ val memberName = member.key
321333 val httpQueryTrait = member.value.getTrait<HttpQueryTrait >()!!
322- writer.write(" $memberName = call.request.queryParameters[#S]" , httpQueryTrait.value)
334+ val targetStringValue = " call.request.queryParameters[\" ${httpQueryTrait.value} \" ]"
335+ val targetShape = ctx.model.expectShape(member.value.target)
336+ writer.writeInline(" $memberName = " )
337+ .call {
338+ when {
339+ targetShape.isStringShape ||
340+ targetShape.isNumberShape ||
341+ targetShape.isBooleanShape ||
342+ targetShape.isTimestampShape ->
343+ renderCastingPrimitiveFromShapeType(
344+ targetStringValue,
345+ targetShape.type,
346+ writer,
347+ " Unsupported type ${member.value.type} for httpQuery" ,
348+ )
349+ targetShape.isListShape -> {
350+ val listMemberShape = ctx.model.expectShape(targetShape.allMembers.values.first().target)
351+ val targetListValue = " (call.request.queryParameters.getAll(\" ${httpQueryTrait.value} \" ) " +
352+ " ?: call.request.queryParameters.getAll(\" ${httpQueryTrait.value} []\" ) " +
353+ " ?: emptyList())"
354+ writer.withBlock(" $targetListValue .mapNotNull{" , " }" ) {
355+ renderCastingPrimitiveFromShapeType(
356+ " it" ,
357+ listMemberShape.type,
358+ writer,
359+ " Unsupported type ${member.value.type} for list in httpLabel" ,
360+ )
361+ }
362+ }
363+ }
364+ }
323365 }
324366 }
325367
0 commit comments