Skip to content

Commit c1b580e

Browse files
authored
Fix handling of DU members that are also DUs (#901)
Avoid spurious import statement for DU types when in unions.rs. Added Spector coverage for the impacted scenario.
1 parent 0484a95 commit c1b580e

24 files changed

Lines changed: 810 additions & 5 deletions

packages/typespec-rust/.scripts/tspcompile.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ const azureHttpSpecsGroup = {
8888
'spector_clientloc_move4': {input: 'azure/client-generator-core/client-location/move-to-root-client'},
8989
'spector_emptystringasnone': {input: 'azure/client-generator-core/deserialize-empty-string-as-null'},
9090
'spector_flattenproperty': {input: 'azure/client-generator-core/flatten-property'},
91+
'spector_hierarchy_building': {input: 'azure/client-generator-core/hierarchy-building'},
9192
'spector_corenextlinkverb': {input: 'azure/client-generator-core/next-link-verb'},
9293
'spector_coreoverride': {input: 'azure/client-generator-core/override/client.tsp'},
9394
'spector_coreusage': {input: 'azure/client-generator-core/usage'},

packages/typespec-rust/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Release History
22

3+
## 0.37.1 (unreleased)
4+
5+
### Bugs Fixed
6+
7+
* Fixed an issue with discriminated unions containing other discriminated unions.
8+
39
## 0.37.0 (2026-03-11)
410

511
### Breaking Changes

packages/typespec-rust/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@azure-tools/typespec-rust",
3-
"version": "0.37.0",
3+
"version": "0.37.1",
44
"description": "TypeSpec emitter for Rust SDKs",
55
"type": "module",
66
"packageManager": "pnpm@10.30.3",

packages/typespec-rust/src/codegen/unions.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,11 @@ export function emitUnions(module: rust.ModuleContainer, context: Context): Unio
6666
body += `${helpers.emitVisibility(rustUnion.visibility)}enum ${rustUnion.name} {\n`;
6767

6868
for (const member of rustUnion.members) {
69-
use.addForType(member.type);
69+
// Use isn't granular enough to realize we're in unions.rs
70+
// so skip adding when the member is also a DU
71+
if (member.type.kind !== 'discriminatedUnion') {
72+
use.addForType(member.type);
73+
}
7074

7175
const docs = helpers.formatDocComment(member.docs, true);
7276
if (docs.length > 0) {

packages/typespec-rust/src/codemodel/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ export interface DiscriminatedUnionMember {
172172
docs: Docs;
173173

174174
/** the type of the discriminated union member */
175-
type: Model;
175+
type: DiscriminatedUnion | Model;
176176

177177
/** discriminator property value */
178178
discriminantValue: string;
@@ -893,7 +893,7 @@ export class DiscriminatedUnionEnvelope implements DiscriminatedUnionEnvelope {
893893
}
894894

895895
export class DiscriminatedUnionMember implements DiscriminatedUnionMember {
896-
constructor(type: Model, discriminantValue: string) {
896+
constructor(type: DiscriminatedUnion | Model, discriminantValue: string) {
897897
this.kind = 'discriminatedUnionMember';
898898
this.type = type;
899899
this.discriminantValue = discriminantValue;

packages/typespec-rust/src/tcgcadapter/adapter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,7 @@ export class Adapter {
626626
if (!subType.discriminatorValue) {
627627
throw new AdapterError('InternalError', `model ${subType.name} has no discriminator value`, subType.__raw?.node);
628628
}
629-
const unionMemberType = this.getModel(subType);
629+
const unionMemberType = subType.discriminatedSubtypes ? this.getDiscriminatedUnion(subType) : this.getModel(subType);
630630
const rustUnionMember = new rust.DiscriminatedUnionMember(unionMemberType, subType.discriminatorValue);
631631
rustUnion.members.push(rustUnionMember);
632632
}

packages/typespec-rust/test/Cargo.lock

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/typespec-rust/test/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ members = [
2929
"spector/azure/client-generator-core/client-location/move-to-root-client",
3030
"spector/azure/client-generator-core/deserialize-empty-string-as-null",
3131
"spector/azure/client-generator-core/flatten-property",
32+
"spector/azure/client-generator-core/hierarchy-building",
3233
"spector/azure/client-generator-core/next-link-verb",
3334
"spector/azure/client-generator-core/override",
3435
"spector/azure/client-generator-core/usage",
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[package]
2+
name = "spector_hierarchy_building"
3+
version = "0.1.0"
4+
authors.workspace = true
5+
edition.workspace = true
6+
license.workspace = true
7+
repository.workspace = true
8+
rust-version.workspace = true
9+
10+
[features]
11+
default = ["azure_core/default"]
12+
13+
[dependencies]
14+
azure_core = { workspace = true }
15+
serde = { workspace = true }
16+
17+
[dev-dependencies]
18+
tokio = { workspace = true }

packages/typespec-rust/test/spector/azure/client-generator-core/hierarchy-building/src/generated/clients/hierarchy_building_animal_operations_client.rs

Lines changed: 101 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)