{"record":{"id":"d8fe1e448a4e5d93","repo":"swc-project/swc","slug":"derive-fromvariant-only-works-for-an-enum","errorCode":null,"errorMessage":"#[derive(FromVariant)] only works for an enum.","messagePattern":"#\\[derive\\(FromVariant\\)\\] only works for an enum\\.","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/from_variant/src/lib.rs","lineNumber":47,"sourceCode":"                is_unknown |= meta.path.is_ident(\"ignore\");\n                Ok(())\n            })\n            .unwrap();\n            is_unknown\n        })\n}\n\nfn derive(\n    DeriveInput {\n        generics,\n        data,\n        ident,\n        ..\n    }: DeriveInput,\n) -> Vec<ItemImpl> {\n    let variants = match data {\n        Data::Enum(DataEnum { variants, .. }) => variants,\n        _ => panic!(\"#[derive(FromVariant)] only works for an enum.\"),\n    };\n\n    let mut from_impls: Vec<ItemImpl> = Vec::new();\n\n    for v in variants {\n        if is_ignored(&v.attrs) {\n            continue;\n        }\n\n        let variant_name = v.ident;\n        match v.fields {\n            Fields::Unnamed(FieldsUnnamed { unnamed, .. }) => {\n                if unnamed.len() != 1 {\n                    panic!(\n                        \"#[derive(FromVariant)] requires all variants to be tuple with exactly \\\n                         one field\"\n                    )\n                }","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/swc-project/swc/blob/5176682b65416c6b5de6b47379ae1588ea3ecb3f/crates/from_variant/src/lib.rs#L29-L65","documentation":"Compile-time panic from `#[derive(FromVariant)]` (crates/from_variant). The macro generates `From<T>` impls that wrap each variant payload (`Enum::Variant(v)`), which only makes sense for enums; applying it to a struct or union hits `panic!(\"#[derive(FromVariant)] only works for an enum.\")` when matching on `input.data`.","triggerScenarios":"`#[derive(FromVariant)]` on a struct or union item.","commonSituations":"Accidentally deriving FromVariant on wrapper structs while refactoring variant types out of an enum; copy-pasting derive lists between items.","solutions":["Move the payload types into enum variants and derive on the enum","Or drop the derive and write the `impl From<T> for X` conversions manually for a struct"],"exampleFix":"// before\n#[derive(FromVariant)]\nstruct Wrapper {\n    inner: Expr,\n}\n\n// after\n#[derive(FromVariant)]\nenum Wrapper {\n    Expr(Expr),\n}","handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Apply `#[derive(FromVariant)]` only to enums","For structs, write `impl From<T> for X` manually"],"tags":["rust","proc-macro","swc","derive","from-impl","compile-time"],"backgroundTag":"proc-macro-misuse","analyzedSha":"5176682b65416c6b5de6b47379ae1588ea3ecb3f","analyzedAt":"2026-08-17T16:16:52.067Z","contentChangedAt":"2026-08-17T16:16:52.067Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}