From 9e7b6c1099ac67632661c139bcf4774e60895874 Mon Sep 17 00:00:00 2001 From: Russell Cohen Date: Mon, 2 Oct 2023 14:39:40 -0400 Subject: [PATCH] Add additional default semantics --- .../core/smithy/generators/BuilderGenerator.kt | 2 ++ .../core/smithy/generators/BuilderGeneratorTest.kt | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt index 80b9329d63..e1de17cfdc 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt @@ -416,6 +416,8 @@ class BuilderGenerator( ")?", ) { missingRequiredField(memberName) } } + } else if (member.isRequired && default != null) { + rust(".or_else(|| Some((#T)()))", default.expr) } } } diff --git a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt index 2220a6f10f..0cf63123ae 100644 --- a/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt +++ b/codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt @@ -177,12 +177,24 @@ internal class BuilderGeneratorTest { @default(true) @required defaultDocument: Document + + @clientOptional + @required + @default([]) + requiredButOptional: StringList + + @default(1) + @clientOptional + @required + reqOptInt: OneDefault + } list StringList { member: String } @default(1) integer OneDefault + """.asSmithyModel(smithyVersion = "2.0") val provider = testSymbolProvider( @@ -207,6 +219,7 @@ internal class BuilderGeneratorTest { assert_eq!(s.an_actually_required_field(), 5); assert_eq!(s.no_default(), None); assert_eq!(s.default_document().as_bool().unwrap(), true); + assert_eq!(s.required_but_optional, Some(vec![])); """, "Struct" to provider.toSymbol(shape), )