diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt index 9f390509ed8b2a81d1ed27e0153817832cad374e..5962e30cdba567d0cb5d23b424b442dad471ce48 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt @@ -29,6 +29,7 @@ import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.model.shapes.TimestampShape import software.amazon.smithy.model.shapes.UnionShape import software.amazon.smithy.model.traits.EnumTrait +import software.amazon.smithy.model.traits.HttpHeaderTrait import software.amazon.smithy.model.traits.HttpPrefixHeadersTrait import software.amazon.smithy.model.traits.StreamingTrait import software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency @@ -52,6 +53,7 @@ import software.amazon.smithy.rust.codegen.core.smithy.isOptional import software.amazon.smithy.rust.codegen.core.smithy.rustType import software.amazon.smithy.rust.codegen.core.util.dq import software.amazon.smithy.rust.codegen.core.util.expectMember +import software.amazon.smithy.rust.codegen.core.util.expectTrait import software.amazon.smithy.rust.codegen.core.util.hasTrait import software.amazon.smithy.rust.codegen.core.util.isTargetUnit import software.amazon.smithy.rust.codegen.core.util.letIf @@ -109,12 +111,14 @@ open class Instantiator( fun doesSetterTakeInOption(memberShape: MemberShape): Boolean } - fun generate(shape: Shape, data: Node, ctx: Ctx = Ctx()) = writable { render(this, shape, data, ctx) } + fun generate(shape: Shape, data: Node, headers: Map = mapOf(), ctx: Ctx = Ctx()) = writable { + render(this, shape, data, headers, ctx) + } - fun render(writer: RustWriter, shape: Shape, data: Node, ctx: Ctx = Ctx()) { + fun render(writer: RustWriter, shape: Shape, data: Node, headers: Map = mapOf(), ctx: Ctx = Ctx()) { when (shape) { // Compound Shapes - is StructureShape -> renderStructure(writer, shape, data as ObjectNode, ctx) + is StructureShape -> renderStructure(writer, shape, data as ObjectNode, headers, ctx) is UnionShape -> renderUnion(writer, shape, data as ObjectNode, ctx) // Collections @@ -219,6 +223,7 @@ open class Instantiator( this, targetShape, data, + mapOf(), ctx.copy() .letIf(memberShape.hasTrait()) { it.copy(lowercaseMapKeys = true) @@ -323,7 +328,7 @@ open class Instantiator( * MyStruct::builder().field_1("hello").field_2(5).build() * ``` */ - private fun renderStructure(writer: RustWriter, shape: StructureShape, data: ObjectNode, ctx: Ctx) { + private fun renderStructure(writer: RustWriter, shape: StructureShape, data: ObjectNode, headers: Map, ctx: Ctx) { fun renderMemberHelper(memberShape: MemberShape, value: Node) { val setterName = builderKindBehavior.setterName(memberShape) writer.withBlock(".$setterName(", ")") { @@ -342,6 +347,15 @@ open class Instantiator( } } + if (data.isEmpty) { + shape.allMembers.entries + .filter { it.value.hasTrait() } + .forEach { (_, value) -> + val trait = value.expectTrait().value + headers.get(trait)?.let { renderMemberHelper(value, Node.from(it)) } + } + } + data.members.forEach { (key, value) -> val memberShape = shape.expectMember(key.value) renderMemberHelper(memberShape, value) diff --git a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt index 2a2564808a71463e93c884d7b86909e082eba10a..46bf1fa44390cd88b900379969fbaa83e26fe53b 100644 --- a/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt +++ b/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt @@ -456,7 +456,7 @@ class ServerProtocolTestGenerator( // Construct expected request. withBlock("let expected = ", ";") { - instantiator.render(this, inputShape, httpRequestTestCase.params) + instantiator.render(this, inputShape, httpRequestTestCase.params, httpRequestTestCase.headers) } checkRequestParams(inputShape, this) @@ -765,7 +765,6 @@ class ServerProtocolTestGenerator( // Pending resolution from the Smithy team, see https://github.com/awslabs/smithy/issues/1068. FailingTest(RestJson, "RestJsonHttpWithHeadersButNoPayload", TestType.Request), - FailingTest(RestJson, "RestJsonHttpWithEmptyBlobPayload", TestType.Request), FailingTest(RestJson, "RestJsonHttpWithEmptyStructurePayload", TestType.Request), // Endpoint trait is not implemented yet, see https://github.com/awslabs/smithy-rs/issues/950.