use proxy_watch::{ProxyStep, Url, read, resolve};
const DEFAULT_URLS: &[&str] = &[
"http://example.com/",
"https://example.com/",
"http://localhost:8080/",
"http://intranet/",
];
fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = read()?;
println!("effective: {:?}\n", config.effective);
let args: Vec<String> = std::env::args().skip(1).collect();
let urls: Vec<&str> = if args.is_empty() {
DEFAULT_URLS.to_vec()
} else {
args.iter().map(String::as_str).collect()
};
for input in urls {
let url = Url::parse(input)?;
match resolve(&config, &url) {
Ok(steps) => {
let decision: Vec<String> = steps
.iter()
.map(|step| match step.endpoint() {
None => "DIRECT".to_owned(),
Some(endpoint) => match endpoint.scheme_hint {
Some(_) => endpoint.to_string(),
None => format!("{}://{endpoint}", step.scheme().unwrap_or("?")),
},
})
.collect();
println!("{input} -> {}", decision.join(", "));
if let Some(ProxyStep::Socks5(endpoint)) = steps.first() {
println!(" (a SOCKS5 proxy: {endpoint})");
}
}
Err(error) => println!("{input} -> error: {error}"),
}
}
Ok(())
}