use chrono::Duration;
use clap::Parser;
use reflecto::Protocol;
use std::fs::File;
use std::io::Write;
use std::path::PathBuf;
use tracing::info;
#[derive(Parser, Debug)]
#[command(version, about, long_about)]
struct Args {
#[arg(long, default_value_t = 5)]
download_timeout: i64,
#[arg(long)]
list_countries: bool,
#[arg(long, default_value_t=reflecto::MIRROR_STATUS_URL.into())]
url: String,
#[arg(short, long, default_value_t=reflecto::SortKey::Score)]
sort: reflecto::SortKey,
#[arg(short, long, default_value_t=usize::MAX)]
number: usize,
#[arg(long)]
save: Option<PathBuf>,
#[arg(short, long)]
age: Option<f64>,
#[arg(short, long)]
protocol: Vec<Protocol>,
#[arg(long)]
isos: bool,
#[arg(long)]
ipv4: bool,
#[arg(long)]
ipv6: bool,
}
#[tokio::main]
async fn main() {
tracing_subscriber::fmt()
.with_max_level(tracing::Level::INFO)
.init();
let args = Args::parse();
let mut mlist = reflecto::MirrorList::from_url(&args.url).await.unwrap();
if args.list_countries {
println!("{}", mlist.print_countries());
return;
}
mlist = mlist.filter(args.age, args.isos, args.ipv4, args.ipv6, &args.protocol);
if let reflecto::SortKey::Rate = args.sort {
let timeout = Duration::seconds(args.download_timeout);
let _ = mlist.update_download_rate(Some(timeout), args.number).await;
}
mlist.sort(args.sort);
let content = mlist.to_file_content(args.number);
if let Some(fp) = args.save {
let mut file = File::create(fp.clone()).expect("unable to create file");
let _ = file.write_all(&content.into_bytes());
info!("file written to {:?}", fp);
} else {
println!("{}", content);
}
}