{"record":{"id":"eb6b1660868642e2","repo":"diesel-rs/diesel","slug":"this-derive-can-only-be-used-on-enums-with-exclusi","errorCode":null,"errorMessage":"this derive can only be used on enums with exclusively unit-variants","messagePattern":"this derive can only be used on enums with exclusively unit-variants","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"diesel_derives/src/enum_.rs","lineNumber":143,"sourceCode":"            sql_name,\n        } = self;\n        let span = *span;\n        quote::quote_spanned! {span=>\n                diesel::internal::derives::enum_::EnumVariant {\n                    discriminant: #discriminant,\n                    rust_name: stringify!(#rust_name),\n                    sql_name: #sql_name,\n                }\n        }\n    }\n}\n\nimpl syn::parse::Parse for DeriveEnumInput {\n    fn parse(input: syn::parse::ParseStream) -> Result<Self> {\n        let input = input.parse::<syn::DeriveInput>()?;\n        let input_span = input.span();\n        if !input.generics.params.is_empty() {\n            return Err(syn::Error::new(input.span(), ERROR_MESSAGE));\n        }\n        let enum_ = match input.data {\n            Data::Enum(data_enum) => data_enum,\n            _ => {\n                return Err(syn::Error::new(input.span(), ERROR_MESSAGE));\n            }\n        };\n        let attrs = diesel_attribute_parser::parse_attributes::<diesel_attribute_parser::StructAttr>(\n            &input.attrs,\n        )?;\n        let rename_all = attrs.iter().find_map(|a| {\n            if let diesel_attribute_parser::StructAttr::RenameAll(_, r) = &a.item {\n                Some(r)\n            } else {\n                None\n            }\n        });\n","sourceCodeStart":125,"sourceCodeEnd":161,"githubUrl":"https://github.com/diesel-rs/diesel/blob/6fa6ed01b24b24248ab2a611698d0a7c6a2e9120/diesel_derives/src/enum_.rs#L125-L161","documentation":"The enum derives in diesel (e.g. `SqliteEnum`-style unit-enum derives in `enum_.rs`) only support plain unit variants. If generics are declared on the enum, the parse step rejects it because generated discriminant/mapping code cannot handle type parameters.","triggerScenarios":"Deriving a diesel enum trait on `enum Foo<T> { A, B }` — an enum with any generic parameters.","commonSituations":"Making a value-carrying enum generic before mapping it to a database string; wrapping an enum in a generic container trait.","solutions":["Remove the generic parameters; enumerate concrete variants instead.","Store the data separately and keep only a fieldless enum for the DB representation.","Implement the target trait manually if generics are essential."],"exampleFix":"// before\n#[derive(...)]\nenum Status<T> { Ok(T), Failed }\n\n// after\n#[derive(...)]\nenum Status { Ok, Failed }","handlingStrategy":"validation","validationCode":"// Compile-time habit: keep DB enums generic-free\n// fn assert_no_generics<T>() {} // not applicable — check the enum declaration instead:\n// enum Status { A, B } // ok\n// enum Status<T> { A, B } // rejected by the derive","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never add generic params to enums used with diesel derives","Move data out of DB enums into wrapper structs","Manually implement the trait when generic enums are unavoidable"],"tags":["diesel","derive-macro","rust","enums","generics"],"backgroundTag":"unsupported-operation","analyzedSha":"6fa6ed01b24b24248ab2a611698d0a7c6a2e9120","analyzedAt":"2026-09-07T01:50:13.074Z","contentChangedAt":"2026-09-07T01:50:13.074Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}