smithy-lang / smithy-kotlin

Smithy code generator for Kotlin (in development)
Apache License 2.0
67 stars 26 forks source link

Union members targeting smithy.api#Unit generates extraneous structures #1040

Open aajtodd opened 4 months ago

aajtodd commented 4 months ago

The smithy.api#Unit type can only be targeted by operation inputs/outputs or as a member of union shape. Inputs and outputs always get type defined even if the operation targeted unit (this is in part because unit support came later but also so that if a service wants to add members to a request/response they can do so in a backwards compatible way).

union Foo {
    stringType: String,
    unitType: Unit
}

Currently we seem to be generating a backing structure for union types

sealed class Foo {
    class StringType(val value: String): Foo()
    class UnitType(val value: Unit): Foo()
}

class Unit { ... }

We most likely just want to generate a variant with no members, e.g.:

sealed class Foo {
    class StringType(val value: String): Foo()
    object UnitType: Foo()
}

Want to confirm that there are no current unions targeting a unit member before changing this.

lauzadis commented 2 months ago

confirmed no current unions target a unit member: smithy select --allow-unknown-traits --selector "union > member > [trait|smithy.api#unitType]" ./*.json