use std::{ env, net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6}, process::ExitCode, }; use log::LevelFilter; use simplelog::{ColorChoice, ConfigBuilder, TermLogger, TerminalMode}; use crate::meteoro::Meteoro; mod bittorrent; mod constants; mod meteoro; mod tracker; mod udp_server; fn main() -> ExitCode { let args: Vec = env::args().collect(); if args.contains(&String::from("--help")) || args.contains(&String::from("-h")) { println!("{}", constants::METEORO_HELP_TEXT); return ExitCode::SUCCESS; } if args.contains(&String::from("--version")) || args.contains(&String::from("-v")) { println!("{} {}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION")); return ExitCode::SUCCESS; } #[cfg(debug_assertions)] let mut log_level: LevelFilter = LevelFilter::Trace; #[cfg(not(debug_assertions))] let mut log_level: LevelFilter = LevelFilter::Info; if args.contains(&String::from("--debug")) { log_level = LevelFilter::Debug; } else if args.contains(&String::from("--trace")) { log_level = LevelFilter::Trace; } let logger_config = ConfigBuilder::new() .set_target_level(LevelFilter::Trace) .set_location_level(LevelFilter::Off) .set_thread_level(LevelFilter::Off) .set_time_level(LevelFilter::Info) .build(); TermLogger::init( log_level, logger_config, TerminalMode::Mixed, ColorChoice::Auto, ) .expect("failed to initialise terminal logging"); let ipv4_flag_idxs: Vec = args .iter() .enumerate() .filter_map(|(idx, s)| if s == "-a" { Some(idx) } else { None }) .collect(); let ipv6_flag_idxs: Vec = args .iter() .enumerate() .filter_map(|(idx, s)| if s == "-A" { Some(idx) } else { None }) .collect(); let mut ip_addrs: Vec = ipv4_flag_idxs .iter() .filter_map(|idx| { Some(SocketAddr::V4( args.get(*idx + 1)?.parse::().ok()?, )) }) .collect(); ip_addrs.extend(ipv6_flag_idxs.iter().filter_map(|idx| { Some(SocketAddr::V6( args.get(*idx + 1)?.parse::().ok()?, )) })); if ip_addrs.is_empty() { ip_addrs.push(SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::LOCALHOST, 6969))); ip_addrs.push(SocketAddr::V6(SocketAddrV6::new( Ipv6Addr::LOCALHOST, 6969, 0, 0, ))); } // bufbuf():codingcodingbuf/ return match Meteoro::start(&ip_addrs) { Ok(_) => ExitCode::SUCCESS, Err(_) => ExitCode::FAILURE, }; }