{"record":{"id":"724ba35d45eaea62","repo":"gitbutlerapp/gitbutler","slug":"unknown-app-suffix-value-expected-one-of-dev","errorCode":null,"errorMessage":"Unknown app suffix '{value}', expected one of: dev, nightly, release","messagePattern":"Unknown app suffix '(.+?)', expected one of: dev, nightly, release","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/but-path/src/lib.rs","lineNumber":339,"sourceCode":"    new_window: bool,\n) -> anyhow::Result<url::Url> {\n    let mut url = url::Url::parse(&format!(\"{scheme}://open\"))?;\n    url.query_pairs_mut()\n        .append_pair(\"path\", &possibly_project_dir.to_string_lossy())\n        .append_pair(\"t\", &timestamp.to_string())\n        .append_pair(\"new_window\", if new_window { \"1\" } else { \"0\" });\n    Ok(url)\n}\n\nimpl std::str::FromStr for AppChannel {\n    type Err = anyhow::Error;\n\n    fn from_str(value: &str) -> Result<Self, Self::Err> {\n        match value {\n            \"nightly\" => Ok(AppChannel::Nightly),\n            \"release\" | \"production\" | \"prod\" => Ok(AppChannel::Release),\n            \"dev\" | \"development\" => Ok(AppChannel::Dev),\n            _ => Err(anyhow::anyhow!(\n                \"Unknown app suffix '{value}', expected one of: dev, nightly, release\"\n            )),\n        }\n    }\n}\n\nfn clean_env_vars<'a, 'b>(\n    var_names: &'a [&'b str],\n) -> impl Iterator<Item = (&'b str, String)> + 'a {\n    var_names\n        .iter()\n        .filter_map(|name| env::var(name).map(|value| (*name, value)).ok())\n        .map(|(name, value)| {\n            (\n                name,\n                value\n                    .split(':')\n                    .filter(|path| !path.contains(\"appimage-run\") && !path.contains(\"/tmp/.mount\"))","sourceCodeStart":321,"sourceCodeEnd":357,"githubUrl":"https://github.com/gitbutlerapp/gitbutler/blob/caf1f223d3cfb94488c9198ad34487c6006c648f/crates/but-path/src/lib.rs#L321-L357","documentation":"`AppChannel::from_str` rejects any value outside the accepted set: `nightly`, `release`/`production`/`prod`, and `dev`/`development` (case-sensitive). It exists so channel identifiers parsed from CLI args, env vars, or config reject unknown suffixes instead of silently defaulting. The error lists the canonical accepted values.","triggerScenarios":"Parsing \"stable\", \"beta\", \"Release\" (wrong case), or \"production \" (whitespace) from `--channel`-style args, environment variables, or serialized config into `AppChannel`.","commonSituations":"Scripts passing marketing channel names (\"stable\") that don't map to build channels; config written for a newer/older version with renamed channels; casing or trailing-newline mistakes when piping values from files.","solutions":["Use one of: dev, nightly, release (aliases: development, production, prod)","Trim and lowercase the input before parsing","If unknown channels should fall back, match explicitly first and default to `AppChannel::Release` instead of parsing blindly"],"exampleFix":"// before\nlet channel: AppChannel = arg.parse()?; // Unknown app suffix 'stable'\n\n// after\nlet channel = match arg.trim().to_ascii_lowercase().as_str() {\n    \"nightly\" => AppChannel::Nightly,\n    \"dev\" | \"development\" => AppChannel::Dev,\n    \"release\" | \"production\" | \"prod\" | _ => AppChannel::Release,\n};","handlingStrategy":"validation","validationCode":"const VALID_CHANNELS: &[&str] = &[\"dev\", \"development\", \"nightly\", \"release\", \"production\", \"prod\"];\nanyhow::ensure!(VALID_CHANNELS.contains(&value.trim()), \"invalid channel {value}\");\nlet channel: AppChannel = value.trim().parse()?;","typeGuard":"fn is_valid_app_channel(value: &str) -> bool {\n    matches!(\n        value.trim(),\n        \"dev\" | \"development\" | \"nightly\" | \"release\" | \"production\" | \"prod\"\n    )\n}","tryCatchPattern":null,"preventionTips":["Trim and lowercase channel strings from env/CLI before parsing","Keep the accepted list in one shared constant so producers and the parser cannot drift","Reject unknown channels at config load with a message listing valid values"],"tags":["rust","parsing","config","enum","app-channel"],"backgroundTag":"invalid-enum-value","analyzedSha":"caf1f223d3cfb94488c9198ad34487c6006c648f","analyzedAt":"2026-08-20T07:55:40.983Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}