{"record":{"id":"de94411751591999","repo":"pydantic/monty","slug":"only-one-from-args-varkwargs-field-is-allowed","errorCode":null,"errorMessage":"only one `#[from_args(varkwargs)]` field is allowed","messagePattern":"only one `#\\[from_args\\(varkwargs\\)\\]` field is allowed","errorType":"validation","errorClass":"syn::Error","httpStatus":null,"severity":"error","filePath":"crates/monty-macros/src/from_args.rs","lineNumber":606,"sourceCode":"                if seen_varargs {\n                    return Err(syn::Error::new(\n                        field.ident.span(),\n                        \"only one `#[from_args(varargs)]` field is allowed\",\n                    ));\n                }\n                if seen_kw_only {\n                    return Err(syn::Error::new(\n                        field.ident.span(),\n                        \"`varargs` cannot appear after keyword-only fields — Python has no \\\n                         signature form with `*args` following keyword-only parameters\",\n                    ));\n                }\n                seen_varargs = true;\n                varargs_idx = Some(idx);\n            }\n            FieldKind::Varkwargs => {\n                if seen_varkwargs {\n                    return Err(syn::Error::new(\n                        field.ident.span(),\n                        \"only one `#[from_args(varkwargs)]` field is allowed\",\n                    ));\n                }\n                seen_varkwargs = true;\n                varkwargs_idx = Some(idx);\n            }\n        }\n\n        if matches!(field.kind, FieldKind::PosOnly | FieldKind::PosOrKeyword) {\n            pos_counter += 1;\n            field.pos_index = Some(pos_counter);\n        }\n        if !matches!(field.kind, FieldKind::Varargs | FieldKind::Varkwargs) {\n            field.slot_index = Some(slot_counter);\n            slot_counter += 1;\n        }\n    }","sourceCodeStart":588,"sourceCodeEnd":624,"githubUrl":"https://github.com/pydantic/monty/blob/adc986b362e3961f407868cb118a99fe831b9e61/crates/monty-macros/src/from_args.rs#L588-L624","documentation":"A compile-time error from the `FromArgs` derive macro. Python allows at most one `**kwargs` parameter, so the macro allows at most one field tagged `#[from_args(varkwargs)]` per struct. A second tagged field cannot map to a Python signature and is rejected.","triggerScenarios":"Deriving `FromArgs` on a struct containing two or more fields annotated `#[from_args(varkwargs)]`.","commonSituations":"Merging two arg structs that each carried their own kwargs field, or copy-pasting a kwargs field to split keyword handling into two buckets.","solutions":["Keep a single `#[from_args(varkwargs)]` field (typically a dict/kwargs type) and do any key filtering in the function body","Remove the `varkwargs` attribute from the duplicate field if it is actually a fixed keyword parameter","Change the duplicate to `#[from_args(kw_only)]` if it represents a specific named keyword argument"],"exampleFix":"// before\n#[derive(FromArgs)]\n#[from_args(name = \"f\"])\nstruct FArgs {\n    #[from_args(varkwargs)]\n    kwargs: Value,\n    #[from_args(varkwargs)]\n    extra: Value,\n}\n\n// after\n#[derive(FromArgs)]\n#[from_args(name = \"f\"])\nstruct FArgs {\n    #[from_args(varkwargs)]\n    kwargs: Value,\n}","handlingStrategy":"validation","validationCode":"// At most one varkwargs field per struct.\nfn at_most_one_varkwargs(kinds: &[&str]) -> bool {\n    kinds.iter().filter(|k| **k == \"varkwargs\").count() <= 1\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["One varkwargs field per arg struct","Filter individual keyword names in the function body, not by adding a second kwargs field","Grep for `from_args(varkwargs)` after merging structs"],"tags":["rust","derive-macro","compile-time","argument-parsing"],"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-14T16:17:12.679Z"}