Skip to content

Commit 0eb095f

Browse files
author
luigi
committed
httpquery and httplabel casting
1 parent 28fc3d3 commit 0eb095f

File tree

2 files changed

+69
-4
lines changed

2 files changed

+69
-4
lines changed

codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/service/KtorStubGenerator.kt

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import software.amazon.smithy.kotlin.codegen.core.withBlock
1010
import software.amazon.smithy.kotlin.codegen.core.withInlineBlock
1111
import software.amazon.smithy.kotlin.codegen.lang.KotlinTypes
1212
import software.amazon.smithy.kotlin.codegen.model.getTrait
13+
import software.amazon.smithy.kotlin.codegen.model.isNumberShape
1314
import software.amazon.smithy.model.shapes.OperationShape
1415
import software.amazon.smithy.model.traits.AuthTrait
1516
import 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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package software.amazon.smithy.kotlin.codegen.service
2+
3+
import software.amazon.smithy.kotlin.codegen.core.KotlinWriter
4+
import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
5+
import software.amazon.smithy.model.shapes.ShapeType
6+
7+
fun renderCastingPrimitiveFromShapeType(variable: String, type: ShapeType, writer: KotlinWriter, errorMessage: String? = null) {
8+
when (type) {
9+
ShapeType.BLOB -> writer.write("$variable?.toByteArray()")
10+
ShapeType.STRING -> writer.write("$variable?.toString()")
11+
ShapeType.BYTE -> writer.write("$variable?.toByte()")
12+
ShapeType.INTEGER -> writer.write("$variable?.toInt()")
13+
ShapeType.SHORT -> writer.write("$variable?.toShort()")
14+
ShapeType.LONG -> writer.write("$variable?.toLong()")
15+
ShapeType.FLOAT -> writer.write("$variable?.toFloat()")
16+
ShapeType.DOUBLE -> writer.write("$variable?.toDouble()")
17+
ShapeType.BIG_DECIMAL -> writer.write("$variable?.toBigDecimal()")
18+
ShapeType.BIG_INTEGER -> writer.write("$variable?.toBigInteger()")
19+
ShapeType.BOOLEAN -> writer.write("$variable?.toBoolean()")
20+
ShapeType.TIMESTAMP -> writer.write("$variable?.let{ #T.fromIso8601(it) }", RuntimeTypes.Core.Instant)
21+
else -> throw IllegalStateException(errorMessage ?: "Unable to render casting primitive for $type")
22+
}
23+
}

0 commit comments

Comments
 (0)