Skip to content

Commit 6f77523

Browse files
author
luigi
committed
timestamp format trait
1 parent 8d49037 commit 6f77523

File tree

3 files changed

+70
-54
lines changed

3 files changed

+70
-54
lines changed

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

Lines changed: 52 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ 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
1413
import software.amazon.smithy.model.shapes.OperationShape
1514
import software.amazon.smithy.model.traits.AuthTrait
1615
import software.amazon.smithy.model.traits.HttpBearerAuthTrait
1716
import software.amazon.smithy.model.traits.HttpLabelTrait
1817
import software.amazon.smithy.model.traits.HttpQueryTrait
1918
import software.amazon.smithy.model.traits.HttpTrait
19+
import software.amazon.smithy.model.traits.TimestampFormatTrait
2020
import software.amazon.smithy.utils.AbstractCodeWriter
2121

2222
class 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) {

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

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,10 @@ enum class ContentType(val value: String) {
3131
return when {
3232
shape.hasTrait(Rpcv2CborTrait.ID) -> CBOR
3333
shape.hasTrait(RestJson1Trait.ID) -> {
34-
println(shape.allMembers)
3534
val inputShape = ctx.model.expectShape(operation.input.get())
3635
for (memberShape in inputShape.allMembers.values) {
37-
println("------------------------------")
38-
println(memberShape)
3936
if (!memberShape.hasTrait(HttpPayloadTrait.ID)) continue
4037
val memberType = ctx.model.expectShape(memberShape.target).type
41-
println(memberType)
4238
when (memberType) {
4339
ShapeType.STRING -> return PLAIN_TEXT
4440
ShapeType.DOCUMENT,

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,15 @@ package software.amazon.smithy.kotlin.codegen.service
33
import software.amazon.smithy.kotlin.codegen.core.KotlinWriter
44
import software.amazon.smithy.kotlin.codegen.core.RuntimeTypes
55
import software.amazon.smithy.model.shapes.ShapeType
6+
import software.amazon.smithy.model.traits.TimestampFormatTrait
67

7-
fun renderCastingPrimitiveFromShapeType(variable: String, type: ShapeType, writer: KotlinWriter, errorMessage: String? = null) {
8+
fun renderCastingPrimitiveFromShapeType(
9+
variable: String,
10+
type: ShapeType,
11+
writer: KotlinWriter,
12+
timestampFormatTrait: TimestampFormatTrait? = null,
13+
errorMessage: String? = null,
14+
) {
815
when (type) {
916
ShapeType.BLOB -> writer.write("$variable?.toByteArray()")
1017
ShapeType.STRING -> writer.write("$variable?.toString()")
@@ -17,7 +24,16 @@ fun renderCastingPrimitiveFromShapeType(variable: String, type: ShapeType, write
1724
ShapeType.BIG_DECIMAL -> writer.write("$variable?.toBigDecimal()")
1825
ShapeType.BIG_INTEGER -> writer.write("$variable?.toBigInteger()")
1926
ShapeType.BOOLEAN -> writer.write("$variable?.toBoolean()")
20-
ShapeType.TIMESTAMP -> writer.write("$variable?.let{ #T.fromIso8601(it) }", RuntimeTypes.Core.Instant)
27+
ShapeType.TIMESTAMP ->
28+
when (timestampFormatTrait?.format) {
29+
TimestampFormatTrait.Format.EPOCH_SECONDS ->
30+
writer.write("$variable?.let{ #T.fromEpochSeconds(it) }", RuntimeTypes.Core.Instant)
31+
TimestampFormatTrait.Format.DATE_TIME ->
32+
writer.write("$variable?.let{ #T.fromIso8601(it) }", RuntimeTypes.Core.Instant)
33+
TimestampFormatTrait.Format.HTTP_DATE ->
34+
writer.write("$variable?.let{ #T.fromRfc5322(it) }", RuntimeTypes.Core.Instant)
35+
else -> writer.write("$variable?.let{ #T.fromIso8601(it) }", RuntimeTypes.Core.Instant)
36+
}
2137
else -> throw IllegalStateException(errorMessage ?: "Unable to render casting primitive for $type")
2238
}
2339
}

0 commit comments

Comments
 (0)