{"record":{"id":"4012289ffbe147ce","repo":"BoundaryML/baml","slug":"rust-unions-are-not-supported-for-this-derive-macro","errorCode":null,"errorMessage":"Rust unions are not supported for this derive macro.","messagePattern":"Rust unions are not supported for this derive macro\\.","errorType":"validation","errorClass":"syn::Error","httpStatus":null,"severity":"error","filePath":"languages/rust/baml-macros/src/baml_serde.rs","lineNumber":22,"sourceCode":"\nuse crate::shared::{ContainerAttrs, VariantAttrs};\n\npub(crate) fn derive_serde(input: &DeriveInput) -> Result<TokenStream> {\n    let container_attrs = ContainerAttrs::from_attrs(&input.attrs)?;\n\n    match &input.data {\n        Data::Struct(..) => Err(syn::Error::new(\n            Span::call_site(),\n            \"BamlSerde cannot be derived for structs, use `#[serde(flatten)]` on dynamic instead.\",\n        )),\n        Data::Enum(data_enum) if container_attrs.union => {\n            derive_serde_union(data_enum, &input.ident)\n        }\n        Data::Enum(..) => Err(syn::Error::new(\n            Span::call_site(),\n            \"BamlSerde cannot be derived for enums, use `#[serde(untagged)]` on dynamic instead.\",\n        )),\n        Data::Union(..) => Err(syn::Error::new(\n            Span::call_site(),\n            \"Rust unions are not supported for this derive macro.\",\n        )),\n    }\n}\n\nfn derive_serde_union(data: &DataEnum, ident: &Ident) -> Result<TokenStream> {\n    let name = ident.to_string();\n\n    let mut literal_serde = Vec::new();\n\n    for variant in &data.variants {\n        let variant_attrs = VariantAttrs::from_attrs(&variant.attrs)?;\n        let variant_ident = &variant.ident;\n\n        if let Some(ref literal_string) = variant_attrs.literal_string {\n            literal_serde.push(quote! {\n                #[allow(non_snake_case)]","sourceCodeStart":4,"sourceCodeEnd":40,"githubUrl":"https://github.com/BoundaryML/baml/blob/bd85ce9dee1463ff04d27efd20531013a4ff46c1/languages/rust/baml-macros/src/baml_serde.rs#L4-L40","documentation":"Compile-time error from the `BamlSerde` derive macro: Rust `union` declarations are not supported at all. Rust unions lack safe field access and do not fit the serde data model the macro targets. Emitted by `derive_serde` for `Data::Union`.","triggerScenarios":"Applying `#[derive(BamlSerde)]` to a `union` declaration, e.g. `#[derive(BamlSerde)] union U { a: i32, b: f32 }`.","commonSituations":"FFI code that defines raw unions and mistakenly applies BamlSerde expecting serialization support.","solutions":["Remove `BamlSerde` from the union","Wrap the union in a struct and manually implement serialization over its bytes","Convert the union to a tagged enum if the discriminant is known"],"exampleFix":"// before\n#[derive(BamlSerde)]\nunion U { int: i32, float: f32 }\n// after\n#[derive(BamlSerde)]\n#[serde(untagged)]\n#[baml(union = true)]\nenum U { Int(i32), Float(f32) }","handlingStrategy":"type-guard","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never derive serde-like macros on Rust unions","Model variant data as tagged/untagged enums instead of unions","Keep raw unions isolated in FFI modules without derive macros"],"tags":["rust","derive-macro","serde","union","compile-time"],"backgroundTag":"unsupported-operation","analyzedSha":"bd85ce9dee1463ff04d27efd20531013a4ff46c1","analyzedAt":"2026-09-12T03:38:25.718Z","contentChangedAt":"2026-09-12T03:38:25.718Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}