{"record":{"id":"fdafdb6fe5586967","repo":"hashicorp/nomad","slug":"format-must-be-key-value","errorCode":null,"errorMessage":"format must be key=value","messagePattern":"format must be key=value","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"command/var.go","lineNumber":233,"sourceCode":"\n\t\t\tb.stdin = true\n\t\t\treturn b.addReader(b.Stdin)\n\t\t}\n\n\t\t// If the arg begins with \"@\" then we need to read a file directly\n\t\tif raw[0] == '@' {\n\t\t\tf, err := os.Open(raw[1:])\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tdefer f.Close()\n\n\t\t\treturn b.addReader(f)\n\t\t}\n\t}\n\n\tif len(parts) != 2 {\n\t\treturn fmt.Errorf(\"format must be key=value\")\n\t}\n\tkey, value := parts[0], parts[1]\n\n\tif len(value) > 0 {\n\t\tif value[0] == '@' {\n\t\t\tcontents, err := os.ReadFile(value[1:])\n\t\t\tif err != nil {\n\t\t\t\treturn fmt.Errorf(\"error reading file: %w\", err)\n\t\t\t}\n\n\t\t\tvalue = string(contents)\n\t\t} else if value[0] == '\\\\' && value[1] == '@' {\n\t\t\tvalue = value[1:]\n\t\t} else if value == \"-\" {\n\t\t\tif b.Stdin == nil {\n\t\t\t\treturn fmt.Errorf(\"stdin is not supported\")\n\t\t\t}\n\t\t\tif b.stdin {","sourceCodeStart":215,"sourceCodeEnd":251,"githubUrl":"https://github.com/hashicorp/nomad/blob/482b49bf1aec006f089bcfc7e632d8f6ac303e5e/command/var.go#L215-L251","documentation":"Each KVBuilder argument must contain exactly one '=' separating key and value (len(parts) == 2 after splitting on '='). Arguments with zero or more than two '=' segments fail with this error. Bare keys, empty strings, and values containing '=' (since strings.Split is used) are all rejected.","triggerScenarios":"Calling KVBuilder.Add with 'key' (no '='), an empty string, or 'a=b=c' (three parts). On the CLI: -var mykey or -var a=b=c.","commonSituations":"Users forgetting the value: '-var feature_flag'; shell word-splitting dropping the '=value' half; attempts to embed '=' in values without understanding the parser splits on every '='.","solutions":["Provide the argument as exactly 'key=value': -var feature_flag=true","Quote arguments in the shell so '=' is not lost to word splitting: -var 'key=value'","Note values containing '=' (e.g. base64) may exceed 2 parts — use a '@file' reference or stdin ('key=-') for such values instead"],"exampleFix":"// before\n-var mykey\n// after\n-var mykey=myvalue","handlingStrategy":"validation","validationCode":"for _, a := range args {\n\tif a == \"-\" { continue }\n\tif strings.Count(a, \"=\") != 1 {\n\t\treturn fmt.Errorf(\"var arg %q must be key=value\", a)\n\t}\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never pass bare keys; always include '=value'","Quote args in shell: -var 'key=value'","For values containing '=', use '@file' or 'key=-' stdin form"],"tags":["cli","argument-parsing","key-value"],"backgroundTag":"invalid-key-value-pair","analyzedSha":"482b49bf1aec006f089bcfc7e632d8f6ac303e5e","analyzedAt":"2026-09-04T07:54:14.808Z","contentChangedAt":"2026-09-04T07:54:14.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}