{"record":{"id":"c8a5250068b93785","repo":"nikivdev/code","slug":"key-cannot-be-empty","errorCode":null,"errorMessage":"Key cannot be empty","messagePattern":"Key cannot be empty","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/env.rs","lineNumber":3329,"sourceCode":"\n        // Show description if available\n        if let Some(desc) = descriptions.as_ref().and_then(|map| map.get(key)) {\n            println!(\"  {} = {}  # {}\", key, masked, desc);\n        } else {\n            println!(\"  {} = {}\", key, masked);\n        }\n    }\n\n    println!();\n    println!(\"{} env var(s)\", vars.len());\n\n    Ok(())\n}\n\n/// Set a personal (global) env var.\npub(crate) fn set_personal_env_var(key: &str, value: &str) -> Result<()> {\n    if key.is_empty() {\n        bail!(\"Key cannot be empty\");\n    }\n\n    let target = resolve_personal_target()?;\n    let environment = \"production\";\n\n    if local_env_enabled() {\n        let path = set_local_env_var(&target, environment, key, value)?;\n        println!(\n            \"✓ Set personal env var locally: {} (stored at {})\",\n            key,\n            path.display()\n        );\n        return Ok(());\n    }\n\n    let auth = load_auth_config()?;\n    let token = match auth.token.as_ref() {\n        Some(token) => token,","sourceCodeStart":3311,"sourceCodeEnd":3347,"githubUrl":"https://github.com/nikivdev/code/blob/a747e741ae92c09071d0ae946ab48488adcff1ce/src/env.rs#L3311-L3347","documentation":"Input validation in `set_personal_env_var`: the function bails immediately if the `key` argument is an empty string. Personal env vars are keyed by name, so an empty key is meaningless and would produce an unusable record; the check happens before any local or cloud write.","triggerScenarios":"Calling the personal env var setter with `key == \"\"` — e.g. a CLI arg parsed from an empty shell variable (`f env set \"$KEY\" ...` where KEY is unset), a split/trim bug that yields an empty string, or a missing positional argument defaulting to empty.","commonSituations":"Shell scripts with unset environment variables interpolated as the key; over-trimming input; CLI arg parsing that doesn't enforce non-empty positional args.","solutions":["Pass a non-empty key name to the set command","In scripts, guard: `[ -n \"$KEY\" ] || exit 1` before invoking","Check for typos where the value and key arguments got swapped or the key variable is empty"],"exampleFix":"// before\nlet key = std::env::var(\"ENV_KEY\").unwrap_or_default();\nset_personal_env_var(&key, \"value\")?;\n\n// after\nlet key = std::env::var(\"ENV_KEY\").context(\"ENV_KEY must be set\")?;\nset_personal_env_var(&key, \"value\")?;","handlingStrategy":"validation","validationCode":"if key.trim().is_empty() {\n    anyhow::bail!(\"env key must be a non-empty identifier\");\n}","typeGuard":"fn is_valid_env_key(key: &str) -> bool {\n    !key.is_empty()\n        && key.chars().all(|c| c.is_ascii_uppercase() || c.is_ascii_digit() || c == '_')\n}","tryCatchPattern":"match set_personal_env_var(key, value) {\n    Err(e) if e.to_string().contains(\"Key cannot be empty\") => {\n        eprintln!(\"Provide a non-empty env var name, e.g. f env set MY_KEY value\");\n    }\n    Err(e) => return Err(e),\n    Ok(_) => (),\n}","preventionTips":["Validate CLI args non-empty before invoking setters","In shell scripts, guard with [ -n \"$KEY\" ] before substitution","Use uppercase snake_case names and reject empty/whitespace keys","Enforce keys are set at argument-parse time, not deep in business logic"],"tags":["validation","env","input-validation"],"backgroundTag":"empty-required-argument","analyzedSha":"a747e741ae92c09071d0ae946ab48488adcff1ce","analyzedAt":"2026-09-01T22:43:55.719Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}