summaryrefslogtreecommitdiff
path: root/src/config.rs
blob: da6538510ee3d8e080eb8b9a6f53bb5735af0121 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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)
    }
}