meteoro/src/main.rs
2025-08-07 19:59:33 +01:00

98 lines
2.7 KiB
Rust

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<String> = 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<usize> = args
.iter()
.enumerate()
.filter_map(|(idx, s)| if s == "-a" { Some(idx) } else { None })
.collect();
let ipv6_flag_idxs: Vec<usize> = args
.iter()
.enumerate()
.filter_map(|(idx, s)| if s == "-A" { Some(idx) } else { None })
.collect();
let mut ip_addrs: Vec<SocketAddr> = ipv4_flag_idxs
.iter()
.filter_map(|idx| {
Some(SocketAddr::V4(
args.get(*idx + 1)?.parse::<SocketAddrV4>().ok()?,
))
})
.collect();
ip_addrs.extend(ipv6_flag_idxs.iter().filter_map(|idx| {
Some(SocketAddr::V6(
args.get(*idx + 1)?.parse::<SocketAddrV6>().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,
};
}