use serde::{Deserialize, Serialize}; use std::{ net::{IpAddr, Ipv4Addr, SocketAddr}, path::Path, }; const CONFIG_FILE: &str = "config.json"; #[derive(Deserialize, Serialize)] pub struct Config { #[serde(default = "Config::default_admin_passwords")] pub admin_passwords: Vec, #[serde(default = "Config::default_cookies_https_only")] pub cookies_https_only: bool, #[serde(default = "Config::default_cookies_domain")] pub cookies_domain: Option, #[serde(default = "Config::default_listen")] pub listen: SocketAddr, #[serde(default = "Config::default_root_url")] pub root_url: String, #[serde(default = "Config::default_title")] pub title: String, } impl Config { fn default_admin_passwords() -> Vec { vec![] } fn default_cookies_https_only() -> bool { false } fn default_cookies_domain() -> Option { None } fn default_listen() -> SocketAddr { SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 10353) } fn default_root_url() -> String { "/".into() } fn default_title() -> String { "ĞMarché".into() } } impl Default for Config { fn default() -> Self { Self { admin_passwords: Self::default_admin_passwords(), cookies_https_only: Self::default_cookies_https_only(), cookies_domain: Self::default_cookies_domain(), listen: Self::default_listen(), root_url: Self::default_root_url(), title: Self::default_title(), } } } pub fn read_config(dir: &Path) -> Config { let path = dir.join(CONFIG_FILE); if !path.is_file() { let config = Config::default(); std::fs::write(path, serde_json::to_string_pretty(&config).unwrap()) .expect("Cannot write config file"); config } else { serde_json::from_str( std::str::from_utf8(&std::fs::read(path).expect("Cannot read config file")) .expect("Bad encoding in config file"), ) .expect("Bad JSON in config file") } }