{"record":{"id":"6db72e19f7190526","repo":"nikivdev/code","slug":"value-format-requires-exactly-one-key","errorCode":null,"errorMessage":"'value' format requires exactly one key","messagePattern":"'value' format requires exactly one key","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/env.rs","lineNumber":3864,"sourceCode":"    let target = if personal {\n        resolve_personal_target()?\n    } else {\n        resolve_env_target()?\n    };\n    let vars = fetch_env_vars(&target, environment, keys, !personal)?;\n\n    if vars.is_empty() {\n        bail!(\"No env vars found\");\n    }\n\n    match format {\n        \"json\" => {\n            let json = serde_json::to_string_pretty(&vars)?;\n            println!(\"{}\", json);\n        }\n        \"value\" => {\n            if keys.len() != 1 {\n                bail!(\"'value' format requires exactly one key\");\n            }\n            let key = &keys[0];\n            if let Some(value) = vars.get(key) {\n                print!(\"{}\", value); // No newline for piping\n            } else {\n                bail!(\"Key '{}' not found\", key);\n            }\n        }\n        \"env\" | _ => {\n            // Default: KEY=VALUE format\n            let mut sorted_keys: Vec<_> = vars.keys().collect();\n            sorted_keys.sort();\n            for key in sorted_keys {\n                let value = &vars[key];\n                // Escape for shell\n                let escaped = value.replace('\\\\', \"\\\\\\\\\").replace('\"', \"\\\\\\\"\");\n                println!(\"{}=\\\"{}\\\"\", key, escaped);\n            }","sourceCodeStart":3846,"sourceCodeEnd":3882,"githubUrl":"https://github.com/nikivdev/code/blob/a747e741ae92c09071d0ae946ab48488adcff1ce/src/env.rs#L3846-L3882","documentation":"Raised by the `value` output format handler, which prints a single raw value (no newline) for piping into other commands. Because raw-value output is only meaningful for exactly one variable, the command enforces that exactly one key was requested and bails otherwise.","triggerScenarios":"Running e.g. `f env pull --format value` with zero keys (no --keys flag) or with two or more keys in --keys.","commonSituations":"Forgetting --keys when piping (`f env pull --format value | ...`); listing multiple keys assuming value format prints them all.","solutions":["Pass exactly one key: `f env pull --format value --keys DATABASE_URL`.","Use `--format env` or `--format json` when you need multiple or all variables.","Shell-evaluate the result when piping: `export $(f env pull --format value --keys KEY)`."],"exampleFix":"// before\nf env pull --format value --keys A,B\n// after (one key per invocation)\nexport A=$(f env pull --format value --keys A)\nexport B=$(f env pull --format value --keys B)","handlingStrategy":"validation","validationCode":"# ensure exactly one key is passed before invoking value format\nKEYS=\"a\"\ncount=$(echo \"$KEYS\" | awk -F, '{print NF}')\n[ \"$count\" -eq 1 ] || { echo \"--format value needs exactly one --keys entry\" >&2; exit 1; }\nf env pull --format value --keys \"$KEYS\"","typeGuard":null,"tryCatchPattern":"// wrapper enforcing the invariant\nfunction env_value() {\n  [ \"$#\" -eq 1 ] || { echo \"usage: env_value <single-key>\" >&2; return 2; }\n  f env pull --format value --keys \"$1\"\n}","preventionTips":["Use `--format env` or `--format json` when you need more than one variable.","Wrap the value-format call in a shell function that asserts a single argument.","Never call value format without an explicit --keys flag."],"tags":["cli","argument-validation","environment"],"backgroundTag":"invalid-cli-argument","analyzedSha":"a747e741ae92c09071d0ae946ab48488adcff1ce","analyzedAt":"2026-09-01T22:43:55.719Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}