bot-forge 1.0.2

Rust CLI for installing agent skills and developer tools from configurable forms.
Documentation
//! Proxy inspection and secret redaction helpers.

use std::env;
use std::fs;
use std::path::PathBuf;

use crate::util::home_dir;

const PROXY_KEYS: [&str; 4] = ["http_proxy", "https_proxy", "HTTP_PROXY", "HTTPS_PROXY"];

pub(crate) fn configuration_summary() -> String {
    let environment = PROXY_KEYS
        .iter()
        .filter(|key| env::var(key).is_ok_and(|value| !value.trim().is_empty()))
        .copied()
        .collect::<Vec<_>>();
    let candidates = cargo_config_candidates();
    let cargo_proxy_lines = candidates
        .iter()
        .find(|path| path.is_file())
        .and_then(|path| fs::read_to_string(path).ok())
        .map_or(0, |contents| proxy_matches(&contents).len());
    format!(
        "{} environment variables; {cargo_proxy_lines} Cargo config entries",
        environment.len()
    )
}

fn cargo_config_candidates() -> Vec<PathBuf> {
    let cargo_home = env::var("CARGO_HOME")
        .map(PathBuf::from)
        .unwrap_or_else(|_| home_dir().join(".cargo"));
    vec![cargo_home.join("config.toml"), cargo_home.join("config")]
}

fn proxy_matches(contents: &str) -> Vec<String> {
    contents
        .lines()
        .map(str::trim)
        .filter(|line| !line.is_empty() && !line.starts_with('#'))
        .filter(|line| {
            let lower = line.to_ascii_lowercase();
            lower.contains("proxy")
                || PROXY_KEYS
                    .iter()
                    .any(|key| lower.contains(&key.to_ascii_lowercase()))
        })
        .map(str::to_string)
        .collect()
}

#[cfg(test)]
mod tests {
    use crate::diagnostics::proxy::proxy_matches;

    #[test]
    fn finds_proxy_lines() {
        let matches = proxy_matches(
            r#"
            # http_proxy=http://ignored
            [http]
            proxy = "http://127.0.0.1:7890"
            export https_proxy=http://127.0.0.1:7891
            "#,
        );
        assert_eq!(matches.len(), 2);
    }
}