use crate::TwinHError; use once_cell::sync::Lazy; use std::{env, error::Error, net::IpAddr, net::Ipv4Addr, net::SocketAddr}; pub static CONFIG_INSTANCE: Lazy = Lazy::new(|| match Config::new() { Ok(c) => c, Err(e) => panic!("twinh: config error: {}", e), }); #[derive(Clone, Debug)] pub struct Config { pub bind_addr: SocketAddr, pub db_path: String, } impl Default for Config { fn default() -> Self { Self { bind_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 5353), db_path: String::from("/var/db/twinh"), } } } impl Config { fn new() -> Result> { let mut args = env::args().skip(1); let db_path = args .next() .ok_or_else(|| TwinHError(String::from("database directory not provided")))?; let mut config = Config { bind_addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 5353), db_path, }; while let Some(arg) = args.next() { match arg.as_str() { "--addr" => { let addr = args.next().unwrap_or_default().parse()?; config.bind_addr.set_ip(addr); } "--port" => { let port = args.next().unwrap_or_default().parse()?; config.bind_addr.set_port(port); } _ => {} }; } Ok(config) } }