{"record":{"id":"777e550720c4794c","repo":"diesel-rs/diesel","slug":"expected-a-literal-expression-but-got-something-e","errorCode":null,"errorMessage":"expected a literal expression, but got something else","messagePattern":"expected a literal expression, but got something else","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"diesel_derives/src/enum_.rs","lineNumber":183,"sourceCode":"            if !v.fields.is_empty() {\n                return Err(syn::Error::new(v.span(), ERROR_MESSAGE));\n            }\n            has_explicit_discriminants = has_explicit_discriminants && v.discriminant.is_some();\n            let discriminant = v\n                .discriminant\n                .as_ref()\n                .map(|(_, v)| {\n                    let (f, l) = match v {\n                        syn::Expr::Lit(l) => (1, l),\n                        syn::Expr::Unary(syn::ExprUnary {\n                            op: syn::UnOp::Neg(_),\n                            expr,\n                            ..\n                        }) => {\n                            if let syn::Expr::Lit(l) = &**expr {\n                                (-1, l)\n                            } else {\n                                return Err(syn::Error::new(\n                                    v.span(),\n                                    \"expected a literal expression, but got something else\",\n                                ));\n                            }\n                        }\n                        _ => {\n                            return Err(syn::Error::new(\n                                v.span(),\n                                \"expected a literal expression, but got something else\",\n                            ));\n                        }\n                    };\n                    let syn::Lit::Int(i) = &l.lit else {\n                        return Err(syn::Error::new(\n                            l.span(),\n                            \"expected a integer literal expression, but got something else\",\n                        ));\n                    };","sourceCodeStart":165,"sourceCodeEnd":201,"githubUrl":"https://github.com/diesel-rs/diesel/blob/6fa6ed01b24b24248ab2a611698d0a7c6a2e9120/diesel_derives/src/enum_.rs#L165-L201","documentation":"An explicit variant discriminant in a diesel enum must be a literal expression (e.g. `A = 1`). If the discriminant is any other expression — a path/constant, arithmetic, or a function call — the parser cannot evaluate it at macro-expansion time and errors.","triggerScenarios":"`enum E { A = SOME_CONST, B }` or `enum E { A = 1 + 2, B }` where the discriminant is not a plain literal.","commonSituations":"Referencing a `const` item to keep values DRY; building values with arithmetic from other constants; code copied from a non-diesel context where complex discriminants are legal.","solutions":["Inline the literal value: `A = 42` instead of `A = SOME_CONST`.","Precompute the value and write it as a literal with a comment explaining provenance.","Remove the discriminant entirely if explicit numbering is not required."],"exampleFix":"// before\nenum Level { Low = BASE, High = BASE + 10 }\n\n// after\nenum Level { Low = 1, High = 11 }","handlingStrategy":"validation","validationCode":"// Discriminants must be plain literals\nfn validate_discriminants(values: &[String]) -> Result<(), String> {\n    for v in values {\n        if v.parse::<i64>().is_err() {\n            return Err(format!(\"discriminant `{v}` must be a literal integer\"));\n        }\n    }\n    Ok(())\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Write discriminants as inline literals, never consts or arithmetic","If values are shared, define a separate const block with a comment tying it to the enum","Prefer omitting discriminants unless the DB encoding requires them"],"tags":["diesel","derive-macro","rust","enums","literals"],"backgroundTag":"invalid-argument-format","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"}