@@ -6,10 +6,7 @@ package software.amazon.smithy.kotlin.codegen.rendering.serde
66
77import software.amazon.smithy.codegen.core.CodegenException
88import software.amazon.smithy.kotlin.codegen.core.*
9- import software.amazon.smithy.kotlin.codegen.model.SymbolProperty
10- import software.amazon.smithy.kotlin.codegen.model.hasTrait
11- import software.amazon.smithy.kotlin.codegen.model.isSparse
12- import software.amazon.smithy.kotlin.codegen.model.targetOrSelf
9+ import software.amazon.smithy.kotlin.codegen.model.*
1310import software.amazon.smithy.kotlin.codegen.rendering.protocol.ProtocolGenerator
1411import software.amazon.smithy.model.shapes.*
1512import software.amazon.smithy.model.traits.SparseTrait
@@ -87,10 +84,11 @@ open class DeserializeStructGenerator(
8784 ShapeType .LIST ,
8885 ShapeType .SET ,
8986 -> renderListMemberDeserializer(memberShape, targetShape as CollectionShape )
87+
9088 ShapeType .MAP -> renderMapMemberDeserializer(memberShape, targetShape as MapShape )
89+
9190 ShapeType .STRUCTURE ,
9291 ShapeType .UNION ,
93- -> renderShapeDeserializer(memberShape)
9492 ShapeType .BLOB ,
9593 ShapeType .BOOLEAN ,
9694 ShapeType .STRING ,
@@ -104,7 +102,11 @@ open class DeserializeStructGenerator(
104102 ShapeType .DOCUMENT ,
105103 ShapeType .BIG_DECIMAL ,
106104 ShapeType .BIG_INTEGER ,
105+ ShapeType .ENUM ,
107106 -> renderShapeDeserializer(memberShape)
107+
108+ ShapeType .INT_ENUM -> error(" IntEnum is not supported until Smithy 2.0" )
109+
108110 else -> error(" Unexpected shape type: ${targetShape.type} " )
109111 }
110112 }
@@ -178,14 +180,20 @@ open class DeserializeStructGenerator(
178180 ShapeType .BLOB ,
179181 ShapeType .DOCUMENT ,
180182 ShapeType .TIMESTAMP ,
183+ ShapeType .ENUM ,
181184 -> renderEntry(elementShape, nestingLevel, isSparse, parentMemberName)
185+
182186 ShapeType .SET ,
183187 ShapeType .LIST ,
184188 -> renderListEntry(rootMemberShape, elementShape as CollectionShape , nestingLevel, isSparse, parentMemberName)
189+
185190 ShapeType .MAP -> renderMapEntry(rootMemberShape, elementShape as MapShape , nestingLevel, isSparse, parentMemberName)
186191 ShapeType .UNION ,
187192 ShapeType .STRUCTURE ,
188193 -> renderNestedStructureEntry(elementShape, nestingLevel, isSparse, parentMemberName)
194+
195+ ShapeType .INT_ENUM -> error(" IntEnum is not supported until Smithy 2.0" )
196+
189197 else -> error(" Unhandled type ${elementShape.type} " )
190198 }
191199 }
@@ -383,14 +391,20 @@ open class DeserializeStructGenerator(
383391 ShapeType .BLOB ,
384392 ShapeType .DOCUMENT ,
385393 ShapeType .TIMESTAMP ,
394+ ShapeType .ENUM ,
386395 -> renderElement(elementShape, nestingLevel, isSparse, parentMemberName)
396+
387397 ShapeType .LIST ,
388398 ShapeType .SET ,
389399 -> renderListElement(rootMemberShape, elementShape as CollectionShape , nestingLevel, parentMemberName)
400+
390401 ShapeType .MAP -> renderMapElement(rootMemberShape, elementShape as MapShape , nestingLevel, parentMemberName)
391402 ShapeType .UNION ,
392403 ShapeType .STRUCTURE ,
393404 -> renderNestedStructureElement(elementShape, nestingLevel, isSparse, parentMemberName)
405+
406+ ShapeType .INT_ENUM -> error(" IntEnum is not supported until Smithy 2.0" )
407+
394408 else -> error(" Unhandled type ${elementShape.type} " )
395409 }
396410 }
@@ -510,20 +524,22 @@ open class DeserializeStructGenerator(
510524 // target shape type to deserialize is either the shape itself or member.target
511525 val target = shape.targetOrSelf(ctx.model)
512526
513- return when (target.type) {
514- ShapeType .BOOLEAN -> " deserializeBoolean()"
515- ShapeType .BYTE -> " deserializeByte()"
516- ShapeType .SHORT -> " deserializeShort()"
517- ShapeType .INTEGER -> " deserializeInt()"
518- ShapeType .LONG -> " deserializeLong()"
519- ShapeType .FLOAT -> " deserializeFloat()"
520- ShapeType .DOUBLE -> " deserializeDouble()"
521- ShapeType .DOCUMENT -> " deserializeDocument()"
522- ShapeType .BLOB -> {
527+ return when {
528+ target.type == ShapeType .BOOLEAN -> " deserializeBoolean()"
529+ target.type == ShapeType .BYTE -> " deserializeByte()"
530+ target.type == ShapeType .SHORT -> " deserializeShort()"
531+ target.type == ShapeType .INTEGER -> " deserializeInt()"
532+ target.type == ShapeType .LONG -> " deserializeLong()"
533+ target.type == ShapeType .FLOAT -> " deserializeFloat()"
534+ target.type == ShapeType .DOUBLE -> " deserializeDouble()"
535+ target.type == ShapeType .DOCUMENT -> " deserializeDocument()"
536+
537+ target.type == ShapeType .BLOB -> {
523538 writer.addImport(" decodeBase64Bytes" , KotlinDependency .UTILS )
524539 " deserializeString().decodeBase64Bytes()"
525540 }
526- ShapeType .TIMESTAMP -> {
541+
542+ target.type == ShapeType .TIMESTAMP -> {
527543 writer.addImport(RuntimeTypes .Core .Instant )
528544 val tsFormat = shape
529545 .getTrait(TimestampFormatTrait ::class .java)
@@ -537,19 +553,21 @@ open class DeserializeStructGenerator(
537553 else -> throw CodegenException (" unknown timestamp format: $tsFormat " )
538554 }
539555 }
540- ShapeType .STRING -> when {
541- target.hasTrait< @Suppress(" DEPRECATION" ) software.amazon.smithy.model.traits.EnumTrait > () -> {
542- val enumSymbol = ctx.symbolProvider.toSymbol(target)
543- writer.addImport(enumSymbol)
544- " deserializeString().let { ${enumSymbol.name} .fromValue(it) }"
545- }
546- else -> " deserializeString()"
556+
557+ target.isEnum -> {
558+ val enumSymbol = ctx.symbolProvider.toSymbol(target)
559+ writer.addImport(enumSymbol)
560+ " deserializeString().let { ${enumSymbol.name} .fromValue(it) }"
547561 }
548- ShapeType .STRUCTURE , ShapeType .UNION -> {
562+
563+ target.type == ShapeType .STRING -> " deserializeString()"
564+
565+ target.type == ShapeType .STRUCTURE || target.type == ShapeType .UNION -> {
549566 val symbol = ctx.symbolProvider.toSymbol(target)
550567 val deserializerName = symbol.documentDeserializerName()
551568 " $deserializerName (deserializer)"
552569 }
570+
553571 else -> throw CodegenException (" unknown deserializer for member: $shape ; target: $target " )
554572 }
555573 }
0 commit comments