diff --git a/codegen/core/src/it/resources/META-INF/smithy/main.smithy b/codegen/core/src/it/resources/META-INF/smithy/main.smithy index 3d7ab539c..27d0c4770 100644 --- a/codegen/core/src/it/resources/META-INF/smithy/main.smithy +++ b/codegen/core/src/it/resources/META-INF/smithy/main.smithy @@ -381,6 +381,8 @@ structure Defaults { @required requiredDefaultBlob: Blob = "c3BhbQ==" + defaultNullBlob: Blob = null + // timestamp @required requiredTimestamp: Timestamp @@ -400,6 +402,8 @@ structure Defaults { @required requiredDefaultTimestamp: Timestamp = 4.2 + defaultNullTimestamp: Timestamp = null + @required requiredList: StringList @@ -420,6 +424,14 @@ structure Defaults { @required requiredDefaultMap: StringMap = {} + defaultEnum: StringYesNo = "YES" + + defaultNullEnum: StringYesNo = null + + defaultIntEnum: IntYesNo = 1 + + defaultNullIntEnum: IntYesNo = null + @required requiredDocument: Document diff --git a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/StructureGenerator.java b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/StructureGenerator.java index ee29f296e..3b1cffae1 100644 --- a/codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/StructureGenerator.java +++ b/codegen/core/src/main/java/software/amazon/smithy/python/codegen/generators/StructureGenerator.java @@ -288,6 +288,11 @@ private String getDefaultValue(PythonWriter writer, MemberShape member) { // see: https://smithy.io/2.0/spec/type-refinement-traits.html#smithy-api-default-trait var defaultNode = member.expectTrait(DefaultTrait.class).toNode(); var target = model.expectShape(member.getTarget()); + // A null default marks the member nullable and resolves to None. Documents are + // excluded since their null default is a non-None Document(None) (see the branch below). + if (!target.isDocumentShape() && defaultNode.isNullNode()) { + return "None"; + } if (target.isTimestampShape()) { ZonedDateTime value = CodegenUtils.parseTimestampNode(model, member, defaultNode); return CodegenUtils.getDatetimeConstructor(writer, value); @@ -318,8 +323,8 @@ private String getDefaultValue(PythonWriter writer, MemberShape member) { }); } + // A null default is handled by the guard above, so it can't reach here. return switch (defaultNode.getType()) { - case NULL -> "None"; case BOOLEAN -> defaultNode.expectBooleanNode().getValue() ? "True" : "False"; // These will be given to a default_factory in field. They're inherently empty, so no need to // worry about any potential values.