{"record":{"id":"2a7c35210a642051","repo":"pydantic/monty","slug":"fromargs-can-only-be-derived-for-structs-with-named-fields","errorCode":null,"errorMessage":"FromArgs can only be derived for structs with named fields","messagePattern":"FromArgs can only be derived for structs with named fields","errorType":"validation","errorClass":"syn::Error","httpStatus":null,"severity":"error","filePath":"crates/monty-macros/src/from_args.rs","lineNumber":156,"sourceCode":"    /// `#[from_args(default = <expr>)]`.\n    Explicit(Box<Expr>),\n}\n\nimpl Signature {\n    fn parse(input: &DeriveInput) -> syn::Result<Self> {\n        let DeriveInput {\n            ident: struct_ident,\n            data,\n            attrs,\n            ..\n        } = input;\n\n        let Data::Struct(DataStruct {\n            fields: Fields::Named(named),\n            ..\n        }) = data\n        else {\n            return Err(syn::Error::new(\n                input.span(),\n                \"FromArgs can only be derived for structs with named fields\",\n            ));\n        };\n\n        let StructAttrs {\n            name: func_name,\n            style,\n            at_most_total,\n            vectorcall,\n            kwarg_error_name,\n            bad_arg,\n            kwargs_not_supported_yet,\n        } = parse_struct_attrs(attrs)?;\n\n        let mut fields = Vec::with_capacity(named.named.len());\n        for field in &named.named {\n            let opts = parse_field_attrs(&field.attrs)?;","sourceCodeStart":138,"sourceCodeEnd":174,"githubUrl":"https://github.com/pydantic/monty/blob/adc986b362e3961f407868cb118a99fe831b9e61/crates/monty-macros/src/from_args.rs#L138-L174","documentation":"A compile-time `syn` error from the `#[derive(FromArgs)]` macro in monty-macros: the derive only supports structs with named fields. Unit structs, newtype/tuple structs, or enums cannot be argument containers because the runtime binder dispatches by parameter name.","triggerScenarios":"Writing `#[derive(FromArgs)]` on `struct Args(String)` (tuple struct), `struct Args;` (unit struct), or an enum.","commonSituations":"Refactoring an existing tuple struct to take parsed CLI/Python-style arguments; applying the derive to an enum to share handling across variants; copy-pasting the derive onto the wrong item.","solutions":["Convert the struct to named fields: `struct Args { pattern: String }`","Use a plain tuple/unit struct without the derive and parse manually","If multiple shapes are needed, define one named-field struct per shape"],"exampleFix":"// before\n#[derive(FromArgs)]\nstruct CompileArgs(String, u32);\n// after\n#[derive(FromArgs)]\nstruct CompileArgs {\n    source: String,\n    opt_level: u32,\n}","handlingStrategy":"type-guard","validationCode":"// compile-time: ensure the derive target has named fields\nconst _check: FromArgsShape = { source: 'x' };","typeGuard":"type NamedFieldsOnly<T> = { [K in keyof T]: T[K] } extends T ? T : never;","tryCatchPattern":null,"preventionTips":["Only derive FromArgs on structs with named fields","Never apply it to enums or tuple structs","Let the compiler catch this — it fails at macro expansion, not runtime"],"tags":["rust","proc-macro","compile-time","derive"],"backgroundTag":"schema-validation-failed","analyzedSha":"adc986b362e3961f407868cb118a99fe831b9e61","analyzedAt":"2026-09-13T19:19:18.698Z","contentChangedAt":"2026-09-13T19:19:18.698Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}