{"record":{"id":"2a9c5264730bf90d","repo":"pydantic/monty","slug":"positional-or-keyword-fields-cannot-appear-after-keyword","errorCode":null,"errorMessage":"positional-or-keyword fields cannot appear after keyword-only fields","messagePattern":"positional-or-keyword fields cannot appear after keyword-only fields","errorType":"validation","errorClass":"syn::Error","httpStatus":null,"severity":"error","filePath":"crates/monty-macros/src/from_args.rs","lineNumber":576,"sourceCode":"            ));\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;\n                    seen_kw_only = true;\n                } else if seen_kw_only {\n                    return Err(syn::Error::new(\n                        field.ident.span(),\n                        \"positional-or-keyword fields cannot appear after keyword-only fields\",\n                    ));\n                } else {\n                    seen_pos_or_kw = true;\n                }\n            }\n            FieldKind::KwOnly => {\n                seen_kw_only = true;\n            }\n            FieldKind::Varargs => {\n                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 {","sourceCodeStart":558,"sourceCodeEnd":594,"githubUrl":"https://github.com/pydantic/monty/blob/adc986b362e3961f407868cb118a99fe831b9e61/crates/monty-macros/src/from_args.rs#L558-L594","documentation":"A compile-time error from the `FromArgs` derive macro. It fires when a plain positional-or-keyword struct field is declared after a `#[from_args(kw_only)]` field. Since Python signatures place all positional-or-keyword parameters before keyword-only ones, the macro treats the struct field order as the parameter order and rejects the impossible arrangement. (Note: after a `varargs` field the macro silently promotes the field to keyword-only instead of erroring.)","triggerScenarios":"Deriving `FromArgs` on a struct where at least one field is marked `#[from_args(kw_only)]` and a later field has no kind attribute (positional-or-keyword).","commonSituations":"Inserting a new parameter in the middle of a struct without noticing a keyword-only field sits above the insertion point; refactoring field order alphabetically or by grouping rather than by signature position.","solutions":["Reorder the fields so every positional-or-keyword field comes before all `#[from_args(kw_only)]` fields","Mark the offending field `#[from_args(kw_only)]` too, if it should be keyword-only","Remove `#[from_args(kw_only)]` from the earlier field if it should be positional"],"exampleFix":"// before\n#[derive(FromArgs)]\n#[from_args(name = \"f\"])\nstruct FArgs {\n    #[from_args(kw_only)]\n    flag: bool,\n    x: i64,\n}\n\n// after\n#[derive(FromArgs)]\n#[from_args(name = \"f\"])\nstruct FArgs {\n    x: i64,\n    #[from_args(kw_only)]\n    flag: bool,\n}","handlingStrategy":"validation","validationCode":"// No positional-or-keyword field may follow a kw_only field.\nfn pos_or_kw_before_kw_only(kinds: &[&str]) -> bool {\n    let first_kw_only = kinds.iter().position(|k| *k == \"kw_only\");\n    match first_kw_only {\n        Some(i) => !kinds[i..].iter().any(|k| *k == \"pos_or_kw\"),\n        None => true,\n    }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Order struct fields exactly as the Python signature reads: positional, *args, keyword-only, **kwargs","Insert new parameters at the signature-correct position, not the end of the struct","Keep the crates/monty-macros/README.md style table open while writing arg 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-14T11:17:12.474Z"}