{"record":{"id":"83b40be1dd1d1e18","repo":"windmill-labs/windmill","slug":"s-are-not-supported","errorCode":null,"errorMessage":" - {}\n{}s are not supported","messagePattern":" - (.+?)\n(.+?)s are not supported","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/parsers/windmill-parser-ruby/src/lib.rs","lineNumber":173,"sourceCode":"                                        ..Default::default()\n                                    });\n                                }\n                                _ => {\n                                    let Range { start_byte, end_byte, .. } = a.range();\n                                    bail!(\n                                        \"Cannot parse optional parameter: {}\",\n                                        &code.get(start_byte..end_byte).unwrap_or(\"CANNOT DISPLAY\")\n                                    )\n                                }\n                            }\n                        }\n                        let kind = a.kind();\n                        if matches!(\n                            kind,\n                            \"keyword_parameter\" | \"splat_parameter\" | \"hash_splat_parameter\"\n                        ) {\n                            let Range { start_byte, end_byte, .. } = a.range();\n                            bail!(\n                                \" - {}\\n{}s are not supported\",\n                                &code.get(start_byte..end_byte).unwrap_or(\"CANNOT DISPLAY\"),\n                                kind.replace(\"_\", \" \")\n                            );\n                        }\n                    }\n                }\n            }\n            return Ok(Some(args));\n        }\n    }\n    Ok(None)\n}\n\n#[cfg(test)]\nmod test {\n\n    use serde_json::json;","sourceCodeStart":155,"sourceCodeEnd":191,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/backend/parsers/windmill-parser-ruby/src/lib.rs#L155-L191","documentation":"windmill-parser-ruby rejects keyword, splat, and hash-splat parameters (`key:`, `*args`, `**opts`) in the `main` signature because Windmill passes inputs as explicitly named arguments and cannot map splat-style parameters. The error names the offending parameter and the unsupported kind.","triggerScenarios":"`def main(*args)`, `def main(**opts)`, or a bare keyword parameter node appearing in the main signature while parsing the Ruby script's signature metadata.","commonSituations":"Ruby developers writing idiomatic variadic signatures; Windmill requires an explicit, typed parameter list for each input.","solutions":["Replace splat/hash-splat parameters with explicit named keyword parameters with defaults","Collect the extra inputs as a single Windmill object parameter (e.g. `opts:`) and access keys inside the body","Remove the variadic parameter and pass each value explicitly"],"exampleFix":"// before\ndef main(**opts)\n// after\ndef main(opts: {})  # opts typed as object in Windmill","handlingStrategy":"try-catch","validationCode":"# reject splats/keywords before deploying\ndef main(**opts); end # <- never use *args / **opts in main","typeGuard":null,"tryCatchPattern":"match parse_ruby_sig_meta(code) {\n  Err(e) if e.to_string().contains(\"s are not supported\") =>\n    eprintln!(\"replace splat/keyword params with named args: {e}\"),\n  Err(e) => return Err(e),\n  Ok(meta) => { /* proceed */ }\n}","preventionTips":["Never use *args, **opts, or bare keyword nodes in `def main`","Model extra inputs as a single object parameter","Validate signatures in CI with the parser"],"tags":["ruby","parser","script-signatures"],"backgroundTag":"unsupported-parameter-kind","analyzedSha":"e474e8803ce2ff5c2df09a58dab51d45f5c922ca","analyzedAt":"2026-09-03T12:38:19.024Z","contentChangedAt":"2026-09-03T12:38:19.024Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}