{"record":{"id":"647992fd017e2317","repo":"pydantic/monty","slug":"no-fields-may-appear-after-a-from-args-varkwargs-field","errorCode":null,"errorMessage":"no fields may appear after a `#[from_args(varkwargs)]` field","messagePattern":"no fields may appear after a `#\\[from_args\\(varkwargs\\)\\]` field","errorType":"validation","errorClass":"syn::Error","httpStatus":null,"severity":"error","filePath":"crates/monty-macros/src/from_args.rs","lineNumber":555,"sourceCode":"            .filter(|f| !matches!(f.kind, FieldKind::Varargs | FieldKind::Varkwargs))\n    }\n}\n\n/// Second parse pass over the fields: resolve implicit kw_only-after-varargs,\n/// enforce declaration ordering, assign positional and slot indices, and\n/// locate the `*args` / `**kwargs` fields.\nfn resolve_field_roles(fields: &mut [Field]) -> syn::Result<(Option<usize>, Option<usize>)> {\n    let mut varargs_idx = None;\n    let mut varkwargs_idx = None;\n    let mut seen_varargs = false;\n    let mut seen_varkwargs = false;\n    let mut seen_pos_or_kw = false;\n    let mut seen_kw_only = false;\n    let mut pos_counter: usize = 0;\n    let mut slot_counter: usize = 0;\n    for (idx, field) in fields.iter_mut().enumerate() {\n        if seen_varkwargs {\n            return Err(syn::Error::new(\n                field.ident.span(),\n                \"no fields may appear after a `#[from_args(varkwargs)]` field\",\n            ));\n        }\n\n        match field.kind {\n            FieldKind::PosOnly => {\n                if seen_pos_or_kw || seen_kw_only || seen_varargs {\n                    return Err(syn::Error::new(\n                        field.ident.span(),\n                        \"positional-only fields must come before positional-or-keyword, varargs, and keyword-only fields\",\n                    ));\n                }\n            }\n            FieldKind::PosOrKeyword => {\n                if seen_varargs {\n                    // Implicit kw_only after varargs.\n                    field.kind = FieldKind::KwOnly;","sourceCodeStart":537,"sourceCodeEnd":573,"githubUrl":"https://github.com/pydantic/monty/blob/adc986b362e3961f407868cb118a99fe831b9e61/crates/monty-macros/src/from_args.rs#L537-L573","documentation":"A compile-time error from the `FromArgs` derive's field-role resolution: `**kwargs` must be the last parameter, mirroring Python, so no struct field may be declared after a `#[from_args(varkwargs)]` field. Any trailing field is rejected at the field's span.","triggerScenarios":"Declaring any field after the one marked `#[from_args(varkwargs)]`, e.g. `#[from_args(varkwargs)] options: ...` followed by `name: String`.","commonSituations":"Reordering struct fields alphabetically or via an IDE sort; appending a new parameter to the end of the struct without noticing the collector field; porting a Python signature where `**kwargs` is last but the struct drifted.","solutions":["Move the `#[from_args(varkwargs)]` field to be the last field of the struct","Move the trailing field before the varkwargs field (respecting required-before-default ordering for positionals)","If the trailing field is really positional, restructure the signature so kwargs remains last"],"exampleFix":"// before\n#[derive(FromArgs)]\nstruct Args {\n    #[from_args(varkwargs)]\n    options: Vec<(String, Value)>,\n    name: String, // after varkwargs — rejected\n}\n// after\n#[derive(FromArgs)]\nstruct Args {\n    name: String,\n    #[from_args(varkwargs)]\n    options: Vec<(String, Value)>,\n}","handlingStrategy":"validation","validationCode":"// varkwargs must be the final field of the struct\nstruct Args { name: String, #[from_args(varkwargs)] opts: Vec<(String, Value)> }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always declare varkwargs last, mirroring Python signatures","After any field reorder (alphabetization, IDE sort), verify varkwargs is still last","Append new parameters before the collector field"],"tags":["rust","proc-macro","compile-time","kwargs"],"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"}