#![allow(dead_code)] #[cfg(feature = "serde-compat")] use serde::Deserialize; use ts_rs::TS; #[derive(TS)] #[cfg_attr(feature = "serde-compat", derive(Deserialize))] #[cfg_attr(feature = "serde-compat", serde(untagged))] #[cfg_attr(not(feature = "serde-compat"), ts(untagged))] #[ts(export, export_to = "union_unnamed_serde/")] enum TestUntagged { A, // serde_json -> `null` B(), // serde_json -> `[]` C( #[cfg_attr(feature = "serde-compat", serde(skip))] #[cfg_attr(not(feature = "serde-compat"), ts(skip))] i32, ), // serde_json -> `null` } #[derive(TS)] #[cfg_attr(feature = "serde-compat", derive(Deserialize))] #[ts(export, export_to = "union_unnamed_serde/")] enum TestExternally { A, // serde_json -> `"A"` B(), // serde_json -> `{"B":[]}` C( #[cfg_attr(feature = "serde-compat", serde(skip))] #[cfg_attr(not(feature = "serde-compat"), ts(skip))] i32, ), // serde_json -> `"C"` } #[derive(TS)] #[cfg_attr(feature = "serde-compat", derive(Deserialize))] #[cfg_attr(feature = "serde-compat", serde(tag = "type", content = "content"))] #[cfg_attr(not(feature = "serde-compat"), ts(tag = "type", content = "content"))] #[ts(export, export_to = "union_unnamed_serde/")] enum TestAdjacently { A, // serde_json -> `{"type":"A"}` B(), // serde_json -> `{"type":"B","content":[]}` C( #[cfg_attr(feature = "serde-compat", serde(skip))] #[cfg_attr(not(feature = "serde-compat"), ts(skip))] i32, ), // serde_json -> `{"type":"C"}` } #[derive(TS)] #[cfg_attr(feature = "serde-compat", derive(Deserialize))] #[cfg_attr(feature = "serde-compat", serde(tag = "type"))] #[cfg_attr(not(feature = "serde-compat"), ts(tag = "type"))] #[ts(export, export_to = "union_unnamed_serde/")] enum TestInternally { A, // serde_json -> `{"type":"A"}` B, // serde_json -> `{"type":"B"}` C( #[cfg_attr(feature = "serde-compat", serde(skip))] #[cfg_attr(not(feature = "serde-compat"), ts(skip))] i32, ), // serde_json -> `{"type":"C"}` } #[test] fn test() { assert_eq!( TestUntagged::decl(), r#"type TestUntagged = null | never[] | null;"# ); assert_eq!( TestExternally::decl(), r#"type TestExternally = "A" | { "B": never[] } | "C";"# ); assert_eq!( TestAdjacently::decl(), r#"type TestAdjacently = { "type": "A" } | { "type": "B", "content": never[] } | { "type": "C" };"# ); assert_eq!( TestInternally::decl(), r#"type TestInternally = { "type": "A" } | { "type": "B" } | { "type": "C" };"# ); }