in smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/rendering/serde/DeserializeStructGenerator.kt [499:544]
protected fun deserializerForShape(shape: Shape): String {
// target shape type to deserialize is either the shape itself or member.target
val target = shape.targetOrSelf(ctx.model)
return when (target.type) {
ShapeType.BOOLEAN -> "deserializeBoolean()"
ShapeType.BYTE -> "deserializeByte()"
ShapeType.SHORT -> "deserializeShort()"
ShapeType.INTEGER -> "deserializeInt()"
ShapeType.LONG -> "deserializeLong()"
ShapeType.FLOAT -> "deserializeFloat()"
ShapeType.DOUBLE -> "deserializeDouble()"
ShapeType.BLOB -> {
writer.addImport("decodeBase64Bytes", KotlinDependency.UTILS)
"deserializeString().decodeBase64Bytes()"
}
ShapeType.TIMESTAMP -> {
writer.addImport(RuntimeTypes.Core.Instant)
val tsFormat = shape
.getTrait(TimestampFormatTrait::class.java)
.map { it.format }
.orElse(defaultTimestampFormat)
when (tsFormat) {
TimestampFormatTrait.Format.EPOCH_SECONDS -> "deserializeString().let { Instant.fromEpochSeconds(it) }"
TimestampFormatTrait.Format.DATE_TIME -> "deserializeString().let { Instant.fromIso8601(it) }"
TimestampFormatTrait.Format.HTTP_DATE -> "deserializeString().let { Instant.fromRfc5322(it) }"
else -> throw CodegenException("unknown timestamp format: $tsFormat")
}
}
ShapeType.STRING -> when {
target.hasTrait<EnumTrait>() -> {
val enumSymbol = ctx.symbolProvider.toSymbol(target)
writer.addImport(enumSymbol)
"deserializeString().let { ${enumSymbol.name}.fromValue(it) }"
}
else -> "deserializeString()"
}
ShapeType.STRUCTURE, ShapeType.UNION -> {
val symbol = ctx.symbolProvider.toSymbol(target)
val deserializerName = symbol.documentDeserializerName()
"$deserializerName(deserializer)"
}
else -> throw CodegenException("unknown deserializer for member: $shape; target: $target")
}
}