use crate::TwinHError;
use once_cell::sync::Lazy;
use std::{env, error::Error, net::IpAddr, net::Ipv4Addr, net::SocketAddr};
pub static CONFIG_INSTANCE: Lazy<Config> = 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<Self, Box<dyn Error>> {
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)
}
}