Skip to content

Commit 68ddedf

Browse files
fix(facet-typescript): emit unit enum variants as strings in mixed tagged enums (#2056)
## Summary Fix `facet-typescript` enum generation for mixed tagged enums so unit variants are emitted as bare string literals, matching `facet-json` wire format. ## Changes - Emit unit variants as `"name"` in the tagged-enum generation path (instead of `{ name: "name" }`) - Add regression test for a `rename_all = "snake_case"` enum mixing unit, newtype, and struct variants - Add snapshot asserting expected TypeScript output ## Test Plan - [x] `cargo nextest run -p facet-typescript` Closes #2055
1 parent 3d9442a commit 68ddedf

2 files changed

Lines changed: 28 additions & 2 deletions

File tree

facet-typescript/src/lib.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -525,8 +525,8 @@ impl TypeScriptGenerator {
525525
let variant_name = variant.effective_name();
526526
match variant.data.kind {
527527
StructKind::Unit => {
528-
// Unit variant as object with type discriminator
529-
variant_types.push(format!("{{ {}: \"{}\" }}", variant_name, variant_name));
528+
// Unit variant serializes as bare string, even in tagged enums.
529+
variant_types.push(format!("\"{}\"", variant_name));
530530
}
531531
StructKind::TupleStruct if variant.data.fields.len() == 1 => {
532532
// Newtype variant: { VariantName: InnerType }
@@ -820,6 +820,23 @@ mod tests {
820820
insta::assert_snapshot!(ts);
821821
}
822822

823+
#[test]
824+
fn test_tagged_enum_unit_and_data_variants() {
825+
#[derive(Facet)]
826+
#[facet(rename_all = "snake_case")]
827+
#[repr(u8)]
828+
#[allow(dead_code)]
829+
enum ResponseStatus {
830+
Pending,
831+
Ok(String),
832+
Error { message: String },
833+
Cancelled,
834+
}
835+
836+
let ts = to_typescript::<ResponseStatus>();
837+
insta::assert_snapshot!("tagged_enum_unit_and_data_variants", ts);
838+
}
839+
823840
#[test]
824841
fn test_struct_with_tuple_field() {
825842
#[derive(Facet)]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
source: facet-typescript/src/lib.rs
3+
expression: ts
4+
---
5+
export type ResponseStatus =
6+
| "pending"
7+
| { ok: string }
8+
| { error: { message: string } }
9+
| "cancelled";

0 commit comments

Comments
 (0)