use serde::{Deserialize, Serialize}; use std::fs; use toml; #[derive(Deserialize, Debug, Serialize, Clone)] #[serde(rename_all = "lowercase")] pub enum Loglevel { Trace, Debug, Info, Warn, Error, } /// `mesk.toml` configuration fields here #[derive(Deserialize, Debug, Serialize, Clone)] pub struct Config { pub repo: Repo, pub log: Log, pub paths: Paths, } #[derive(Deserialize, Debug, Serialize, Clone)] pub struct Log { #[serde(rename = "log_file")] pub log_file: String, #[serde(rename = "log_level")] pub log_level: Loglevel, } // Rename needed for editing mesk.toml file fields but dont touch code. #[derive(Deserialize, Debug, Serialize, Clone)] pub struct Repo { #[serde(rename = "repo_url")] pub repo_url: String, #[serde(rename = "auto_update")] pub auto_update: bool, #[serde(rename = "destination")] pub destination: (String, String), #[serde(rename = "repo_http_url")] pub repo_http_url: Option, // #[serde(rename = "arch")] // pub arch = arch; } #[derive(Deserialize, Debug, Serialize, Clone)] pub struct Paths { #[serde(rename = "cache_dir")] pub cache_dir: String, #[serde(rename = "build_dir")] pub build_dir: String, } impl Config { /// Parse the /etc/mesk.toml file and return the Config object. /// /// This function reads the /etc/mesk.toml file, parses it and returns the Config object. pub fn parse() -> Result { let contents = fs::read_to_string("/etc/mesk/mesk.toml").unwrap(); let result: Config = toml::from_str(&contents)?; Ok(result) } /// Return the default configuration as a toml string. /// /// This function returns the default configuration as a toml string. #[allow(clippy::should_implement_trait)] pub fn default() -> Result { let default: Config = Config { repo: Repo { repo_url: format!("https://mesk.anthrill.i2p/repo/{}/", std::env::consts::ARCH), auto_update: true, destination: (String::from("mesk"), String::from("mesk")), repo_http_url: format!( "http://github.com/Anthrill/repo-mirror/{}", std::env::consts::ARCH ) .into(), // Its a hurt place, you need to generate destinations by i2pd and paste here (to mesk.toml) // Better to leave it empty or set it to (mesk, mesk), now destination conn not implemented }, log: Log { log_file: String::from("/var/log/mesk.log"), log_level: Loglevel::Info, }, paths: Paths { cache_dir: String::from("/var/cache/mesk"), build_dir: String::from("/var/lib/mesk"), }, }; let toml_str = toml::to_string(&default)?; Ok(toml_str) } pub fn generate( repo: &Option, cachedir: &Option, buildir: &Option, ) -> Result { let generator: Config = Config { repo: Repo { repo_url: if repo.is_none() { format!("https://mesk.anthrill.i2p/repo/{}/", std::env::consts::ARCH) } else { repo.clone().unwrap() }, auto_update: true, destination: (String::from("mesk"), String::from("mesk")), repo_http_url: None, }, log: Log { log_file: String::from("/var/log/mesk.log"), log_level: Loglevel::Info, }, paths: Paths { cache_dir: if cachedir.is_none() { String::from("/var/cache/mesk") } else { cachedir.clone().unwrap() }, build_dir: if buildir.is_none() { String::from("/var/cache/mesk/build") } else { buildir.clone().unwrap() }, /* FIXME: I can leave this parameter, but I think it would be better to make the build path in the /var/cache/mesk/$pkgname-$pkgver/BUILD/ */ }, }; toml::to_string(&generator) } }