pub struct Args { pub ip: String, pub port: u16, pub unsafe_mode: bool, pub init: bool, } pub fn parse_args() -> Args { let args: Vec = std::env::args().collect(); let mut ip = "127.0.0.1".to_string(); let mut port = 11525; let mut unsafe_mode = false; let mut init = false; let mut i = 1; while i < args.len() { match args[i].as_str() { "-p" => { if i + 1 < args.len() { port = args[i + 1].parse::().unwrap_or_else(|_| { eprintln!("Invalid port number: {}", args[i + 1]); std::process::exit(1); }); i += 2; } else { eprintln!("-p requires a port number"); std::process::exit(1); } } "-i" => { if i + 1 < args.len() { ip = args[i + 1].clone(); if ip != "127.0.0.1" && ip != "0.0.0.0" { eprintln!( "Invalid IP address: {}. Must be 127.0.0.1 or 0.0.0.0", ip ); std::process::exit(1); } i += 2; } else { eprintln!("-i requires an IP address"); std::process::exit(1); } } "--unsafe" => { unsafe_mode = true; i += 1; } "--init" => { init = true; i += 1; } "-h" | "--help" => { print_usage(); std::process::exit(0); } other => { eprintln!("Unknown argument: {other}"); print_usage(); std::process::exit(1); } } } Args { ip, port, unsafe_mode, init, } } fn print_usage() { println!( "Usage: server [OPTIONS]\n\ \n\ Options:\n\ \x20 -i Bind address (127.0.0.1 or 0.0.0.0)\n\ \x20 -p Bind port (default 11525)\n\ \x20 --init Generate identity.p12, key.pem and cert.pem, then exit\n\ \x20 --unsafe Run in unsafe mode (warning only)\n\ \x20 -h, --help Show this help\n\ \n\ First run:\n\ \x20 cargo run --bin server -- --init\n\ \x20 cargo run --bin server" ); }