{"record":{"id":"ba8d81ef4e8d5d1e","repo":"windmill-labs/windmill","slug":"section-dependency-element-should-be-a-map","errorCode":null,"errorMessage":"{section} dependency element should be a map","messagePattern":"(.+?) dependency element should be a map","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/parsers/windmill-parser-yaml/src/lib.rs","lineNumber":888,"sourceCode":"        _ => serde_json::Value::Null,\n    }\n}\n\nfn update_versions(\n    section: &str,\n    yaml: &mut Yaml,\n    versions: &HashMap<String, String>,\n) -> anyhow::Result<String> {\n    let mut logs = String::new();\n\n    let Yaml::Hash(ref mut m) = yaml else {\n        return Err(anyhow!(\"{section} dependency should be a map\"));\n    };\n\n    if let Some(Yaml::Array(elements)) = m.get_mut(&Yaml::String(section.to_string())) {\n        for el in elements {\n            let Yaml::Hash(ref mut h) = el else {\n                return Err(anyhow!(\"{section} dependency element should be a map\"));\n            };\n\n            if let Some(name) = h\n                .get(&Yaml::String(\"name\".to_string()))\n                .and_then(|n| n.as_str())\n            {\n                if let Some(version) = versions.get(name) {\n                    h.insert(\n                        Yaml::String(\"version\".to_string()),\n                        Yaml::String(version.to_string()),\n                    );\n                } else {\n                    logs.push_str(&format!(\"WARNING: {section} dependency `{name}` has no locked version, using the latest or system installed version.\\n\"));\n                }\n            } else {\n                return Err(anyhow!(\n                    \"{section} dependency element: missing or invalid `name` field\"\n                ));","sourceCodeStart":870,"sourceCodeEnd":906,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/backend/parsers/windmill-parser-yaml/src/lib.rs#L870-L906","documentation":"Within a `roles` or `collections` section of an Ansible requirements file, each dependency entry must itself be a mapping with a `name` key. update_versions throws this error when an element of the roles/collections array is a scalar, list, or null instead of a hash, so no name/version can be read from it.","triggerScenarios":"A requirements file like `roles: [geerlingguy.docker]` (bare strings in the list) or `collections: - ~`; entries written as `- name: x` but mis-indented so they parse as nested lists or strings.","commonSituations":"Short-form role references (`- geerlingguy.docker`) which ansible-galaxy accepts but this version-pinning parser does not; YAML indentation breaking `- name:` into a scalar; empty list items (`- `) in the section.","solutions":["Rewrite every entry as a mapping: `- name: <role-or-collection>` (optionally with `version:`).","Replace short-form role strings with the map form.","Remove null/empty entries from the section list.","Fix indentation so `- name:` is at the entry level, not nested deeper."],"exampleFix":"# before\nroles:\n  - geerlingguy.docker\n# after\nroles:\n  - name: geerlingguy.docker\n    version: 6.1.0","handlingStrategy":"validation","validationCode":"fn validate_dep_entries(input: &str) -> Result<(), String> {\n    let doc: serde_yaml::Value = serde_yaml::from_str(input).map_err(|e| e.to_string())?;\n    for section in [\"roles\", \"collections\"] {\n        if let Some(items) = doc.get(section).and_then(|s| s.as_sequence()) {\n            for (i, e) in items.iter().enumerate() {\n                if e.as_mapping().is_none() {\n                    return Err(format!(\"{section}[{i}] must be a mapping with a name field\"));\n                }\n            }\n        }\n    }\n    Ok(())\n}","typeGuard":"fn is_named_entry(v: &serde_yaml::Value) -> bool {\n    v.as_mapping().map(|m| m.contains_key(\"name\")).unwrap_or(false)\n}","tryCatchPattern":"match pin_versions(input, &roles, &collections) {\n    Err(e) if e.to_string().contains(\"dependency element should be a map\") => {\n        eprintln!(\"Each entry must be a map: - name: <dep> (short-form strings rejected)\\n{e}\");\n    }\n    other => other,\n}","preventionTips":["Never use short-form entries like `- geerlingguy.docker`; always `- name: geerlingguy.docker`","Avoid empty list items (`- `) in roles/collections","Verify each entry parses as a mapping, not a scalar","Lint the requirements file structure before deploy"],"tags":["yaml","ansible","requirements","missing-field"],"backgroundTag":"invalid-dependency-manifest-entry","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"}