use lexopt::{Parser, prelude::*}; const DEFAULT_ADDRESS: &str = "127.0.0.1:6666"; const DEFAULT_FREQUENCY: u64 = 150; const DEFAULT_MODULATION: u8 = 5; #[derive(Clone)] pub struct Configuration { pub address: String, pub frequency: u64, pub modulation: u8, } impl Configuration { pub fn new() -> Self { let mut address = DEFAULT_ADDRESS.to_string(); let mut frequency = DEFAULT_FREQUENCY; let mut modulation = DEFAULT_MODULATION; let mut parser = Parser::from_env(); while let Ok(Some(argument)) = parser.next() { match argument { Short('l') | Long("listen-address") => { if let Ok(value) = parser.value().and_then(|v| v.parse()) { address = value; } else { eprintln!("Warning: Invalid listen address ignored."); } } Short('f') | Long("frequency") => { if let Ok(value) = parser.value().and_then(|v| v.parse()) { frequency = value; } else { eprintln!("Warning: Invalid frequency ignored."); } } Short('m') | Long("modulation") => { if let Ok(value) = parser.value().and_then(|v| v.parse()) { modulation = value; } else { eprintln!("Warning: Invalid modulation ignored."); } } Long("help") => { println!( "Usage: tomato-sauce [-l|--listen-address=LISTEN_ADDRESS] [-f|--frequency=NUMBER] [-m|--modulation=NUMBER]" ); std::process::exit(0); } _ => { eprintln!("Warning: Unknown argument ignored"); } } } Configuration { address, frequency, modulation, } } }