{"record":{"id":"0c2d6f1cf15f162a","repo":"jdx/mise","slug":"brew-cask-unsupported-context-field-0c2d6f","errorCode":null,"errorMessage":"brew-cask: unsupported {context} field {}","messagePattern":"brew-cask: unsupported (.+?) field (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/packages/brew/cask/artifacts.rs","lineNumber":339,"sourceCode":"        .map(|arg| {\n            arg.as_str()\n                .map(str::to_string)\n                .ok_or_else(|| eyre!(\"brew-cask: {kind} args must be strings\"))\n        })\n        .collect()\n}\n\npub(super) fn reject_unsupported_artifact_fields(\n    context: &str,\n    object: &serde_json::Map<String, Value>,\n    allowed: &[&str],\n) -> Result<()> {\n    let unsupported = object\n        .keys()\n        .filter(|key| !allowed.contains(&key.as_str()))\n        .cloned()\n        .collect::<Vec<_>>();\n    if !unsupported.is_empty() {\n        bail!(\n            \"brew-cask: unsupported {context} field {}\",\n            unsupported.join(\", \")\n        );\n    }\n    Ok(())\n}\n\npub(super) fn parse_generic_artifact(value: &Value) -> Result<Option<GenericArtifact>> {\n    let Some(artifact) = value.as_object().and_then(|object| object.get(\"artifact\")) else {\n        return Ok(None);\n    };\n    let values = artifact\n        .as_array()\n        .ok_or_else(|| eyre!(\"brew-cask: artifact metadata must be an array\"))?;\n    let source = values\n        .first()\n        .and_then(Value::as_str)","sourceCodeStart":321,"sourceCodeEnd":357,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/system/packages/brew/cask/artifacts.rs#L321-L357","documentation":"Generic field validator for cask artifacts: given an object, a context label, and an allow-list of keys, it bails listing any keys outside the allow-list. Used by parse_installer_artifact and parse_generated_completion_artifact to reject unknown fields.","triggerScenarios":"An `installer` or `generate_completions_from_executable` artifact options object contains a key not in that artifact's allowed set (e.g. typo 'shells' where 'shell' is expected).","commonSituations":"Typos in option names; copying options between artifact kinds that have different allow-lists; newer Homebrew fields not yet supported by the parser.","solutions":["Remove the listed unsupported fields or rename them to allowed ones.","Check the allowed-field set for the specific artifact context (installer vs generate_completions_from_executable).","Verify against the cask definition schema for this parser version."],"exampleFix":"// before\n{\"manual\": \"installer/manual/mytool\"}  // if manual is not allowed\n// after\nremove \"manual\" or use an allowed field","handlingStrategy":"validation","validationCode":"fn reject_unknown(o: &serde_json::Map<String, serde_json::Value>, allowed: &[&str]) -> Vec<&String> {\n    o.keys().filter(|k| !allowed.contains(&k.as_str())).collect()\n}\nassert!(reject_unknown(&opts, &[\"args\", \"base_name\"]).is_empty());","typeGuard":null,"tryCatchPattern":"match result {\n    Err(e) if e.to_string().contains(\"unsupported\") && e.to_string().contains(\"field\") => {\n        // extract field names from message and correct the cask stanza\n    }\n    other => other?,\n}","preventionTips":["Maintain per-artifact allowed-key lists next to your cask generators","Diff generated stanzas against the allow-list in CI","Watch for upstream Homebrew field renames"],"tags":["brew-cask","validation","unsupported-field","config"],"backgroundTag":"unsupported-config-value","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}