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);
}
}