cc-switch-tui 0.1.3

All-in-One Assistant for Claude Code, Codex, Gemini, OpenCode, OpenClaw & Hermes
Documentation
pub(super) fn update_toml_base_url(toml_str: &str, new_url: &str) -> String {
    use toml_edit::DocumentMut;

    let mut doc = match toml_str.parse::<DocumentMut>() {
        Ok(doc) => doc,
        Err(_) => return toml_str.to_string(),
    };

    let model_provider = doc
        .get("model_provider")
        .and_then(|item| item.as_str())
        .map(str::to_string);

    if let Some(provider_key) = model_provider {
        if doc.get("model_providers").is_none() {
            doc["model_providers"] = toml_edit::table();
        }

        if let Some(model_providers) = doc["model_providers"].as_table_mut() {
            if !model_providers.contains_key(&provider_key) {
                model_providers[&provider_key] = toml_edit::table();
            }

            if let Some(provider_table) = model_providers[&provider_key].as_table_mut() {
                provider_table["base_url"] = toml_edit::value(new_url);
                return doc.to_string();
            }
        }
    }

    doc["base_url"] = toml_edit::value(new_url);
    doc.to_string()
}

pub(super) fn remove_loopback_base_url_from_toml(toml_str: &str) -> String {
    use toml_edit::DocumentMut;

    let mut doc = match toml_str.parse::<DocumentMut>() {
        Ok(doc) => doc,
        Err(_) => return toml_str.to_string(),
    };

    let model_provider = doc
        .get("model_provider")
        .and_then(|item| item.as_str())
        .map(str::to_string);

    if let Some(provider_key) = model_provider {
        if let Some(base_url) = doc
            .get("model_providers")
            .and_then(|item| item.as_table_like())
            .and_then(|table| table.get(&provider_key))
            .and_then(|item| item.as_table_like())
            .and_then(|table| table.get("base_url"))
            .and_then(|item| item.as_str())
        {
            if contains_loopback_proxy_url(base_url) {
                if let Some(section) = doc
                    .get_mut("model_providers")
                    .and_then(|item| item.as_table_like_mut())
                    .and_then(|table| table.get_mut(&provider_key))
                    .and_then(|item| item.as_table_like_mut())
                {
                    section.remove("base_url");
                }
            }
        }
    }

    if doc
        .get("base_url")
        .and_then(|item| item.as_str())
        .is_some_and(contains_loopback_proxy_url)
    {
        doc.as_table_mut().remove("base_url");
    }

    doc.to_string()
}

pub(super) fn is_loopback_proxy_url(url: &str) -> bool {
    url.contains("127.0.0.1") || url.contains("localhost") || url.contains("[::1]")
}

pub(super) fn contains_loopback_proxy_url(text: &str) -> bool {
    text.contains("127.0.0.1") || text.contains("localhost") || text.contains("[::1]")
}