Fix errors for unions with unit target membershape (#3547)
## Motivation and Context Unions that have a [unit target member shape](https://smithy.io/2.0/spec/model.html#unit-type) do not have an associated data in the generated Rust enum. Closes Issue: [2546](https://github.com/smithy-lang/smithy-rs/issues/2546 ) ## Description On the **server** side, when the union has constrained members, the code generated for the conversion from the `Unconstrained` type to the `Constrained` type incorrectly assumed that each Rust enum would have associated data. ``` rust-server-codegen/src/unconstrained.rs:31:129 | | crate::unconstrained::some_union_with_unit_unconstrained::SomeUnionWithUnitUnconstrained::Option1(unconstrained) => Self::Option1( | -^^^^^^^^^^^^- help: consider using a semicolon here to finish the statement: `;` | _________________________________________________________________________________________________________________________________| | | | | unconstrained | | ), | |_____________- call expression requires function | ::: rust-server-codegen/src/model.rs:152:5 | | Option1, | ------- `SomeUnionWithUnit::Option1` defined here ``` The marshaling code for event streams with unit target types incorrectly assumed that the variant would have associated data. ``` rust-server-codegen/src/event_stream_serde.rs impl ::aws_smithy_eventstream::frame::MarshallMessage for TestEventMarshaller { fn marshal() { let payload = match input { Self::Input::KeepAlive(inner) => { ``` On the **client** side, the `event_stream_serde` code incorrectly assumes that a union member, which has the `@streaming` trait applied to it, takes a `model::Unit` type. ``` rust-client-codegen/src/event_stream_serde.rs: | | crate::types::TestEvent::KeepAlive(crate::types::Unit::builder().build()), | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--------------------------------------- | | | call expression requires function | ::: rust-client-codegen/src/types/_test_event.rs | | KeepAlive, | --------- `TestEvent::KeepAlive` defined here ``` ## Testing A unit test has been added that tests the following model: ``` $version: "2" namespace com.example use aws.protocols#restJson1 use smithy.framework#ValidationException @restJson1 @title("Test Service") service TestService { version: "0.1", operations: [ TestOperation TestSimpleUnionWithUnit ] } @http(uri: "/testunit", method: "POST") operation TestSimpleUnionWithUnit { input := { @required request: SomeUnionWithUnit } output := { result : SomeUnionWithUnit } errors: [ ValidationException ] } @length(min: 13) string StringRestricted union SomeUnionWithUnit { Option1: Unit Option2: StringRestricted } @http(uri: "/test", method: "POST") operation TestOperation { input := { payload: String } output := { @httpPayload events: TestEvent }, errors: [ValidationException] } @streaming union TestEvent { KeepAlive: Unit, Response: TestResponseEvent, } structure TestResponseEvent { data: String } ``` --------- Co-authored-by:Fahad Zubair <fahadzub@amazon.com>
Loading
Please register or sign in to comment