Skip to content

[compiler] Allow @discriminated union variants to be unions when envelope is "none" #9817

@witemple-msft

Description

@witemple-msft

Clear and concise description of the problem

Currently, in @discriminated(#{ envelope: "none"}) unions, we require variants to be models that have the discriminator property on them set to the correct value (Error: invalid-discriminated-union-variant if not). I propose that we allow a discriminated union variant to also be a union if each variant of the sub-union conforms to the discriminator property rule. This would allow constructs like the following:

@discriminated(#{ envelope: "none", discriminatorPropertyName: "kind" })
union X {
  a: A;
  b: B;
}

model A {
  kind: "a";
  //...
}

@discriminated(#{ envelope: "none", discriminatorPropertyName: "bKind" })
union B {
  c: C;
  d: D;
}

model C {
  kind: "b";
  bKind: "c";
  // ...
}

model D {
  kind: "b";
  bKind: "d";
  // ...
}

I ran into this trying to describe a schema with this sort of structure, where one of the variants of a top level union discriminated by "kind" itself has several subvariants discriminated by its own separate property.

Checklist

  • Follow our Code of Conduct
  • Read the docs.
  • Check that there isn't already an issue that request the same feature to avoid creating a duplicate.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions