{"record":{"id":"5c395107eb9014cb","repo":"Hmbown/CodeWhale","slug":"custom-provider-base-url-is-invalid-err","errorCode":null,"errorMessage":"custom provider base URL is invalid: {err}","messagePattern":"custom provider base URL is invalid: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tui/src/config_persistence.rs","lineNumber":414,"sourceCode":"    }\n    if !value\n        .chars()\n        .all(|ch| ch.is_ascii_alphanumeric() || matches!(ch, '_' | '-'))\n    {\n        bail!(\"custom provider name may only use letters, numbers, '-' and '_'\");\n    }\n    Ok(value.to_string())\n}\n\nfn normalize_custom_provider_base_url(raw: &str) -> anyhow::Result<String> {\n    use anyhow::bail;\n\n    let value = raw.trim().trim_end_matches('/');\n    if value.is_empty() {\n        bail!(\"custom provider base URL is required\");\n    }\n    let parsed = reqwest::Url::parse(value)\n        .map_err(|err| anyhow::anyhow!(\"custom provider base URL is invalid: {err}\"))?;\n    if !matches!(parsed.scheme(), \"http\" | \"https\") || parsed.host_str().is_none() {\n        bail!(\"custom provider base URL must be an http(s) URL with a host\");\n    }\n    Ok(value.to_string())\n}\n\nfn normalize_optional_custom_provider_field(raw: &str) -> Option<String> {\n    let value = raw.trim();\n    (!value.is_empty()).then(|| value.to_string())\n}\n\npub(crate) fn persist_hotbar_bindings(\n    config_path: Option<&Path>,\n    bindings: &[codewhale_config::HotbarBindingToml],\n) -> anyhow::Result<PathBuf> {\n    let path = config_toml_path(config_path)?;\n    mutate_config_document(&path, |doc| {\n        let table = doc.as_table_mut();","sourceCodeStart":396,"sourceCodeEnd":432,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/8880682c63083a91624de936797efa3ce9e498fd/crates/tui/src/config_persistence.rs#L396-L432","documentation":"Error \"custom provider base URL is invalid: {err}\" thrown in Hmbown/CodeWhale.","triggerScenarios":"Thrown at crates/tui/src/config_persistence.rs:414 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":[],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"8880682c63083a91624de936797efa3ce9e498fd","analyzedAt":"2026-08-16T11:31:27.956Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}