use std::{collections::HashMap, path::PathBuf, str::FromStr}; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, Debug, PartialEq)] struct SiteInfo { aliases: Vec, /// Aliases for this subdomain - will have the same exact settings /// The socket address (e.g. `192.168.1.8:8080`) or port number (if on `localhost`) of the service to reverse proxy address: String, /// What auth file to use - 0 means none #[serde(skip_serializing_if = "Option::is_none")] auth: Option, #[serde(skip_serializing_if = "Option::is_none")] conf_file: Option, } #[derive(Serialize, Deserialize, Debug, PartialEq)] struct Config { /// What directory to output the conf files to #[serde(default = "default_output_dir")] output_dir: PathBuf, domain: String, /// Subdomains/services in the format `subdomain: SiteInfo` subdomains: HashMap, /// Paths to the htpasswd file for each auth number - starts at 1, goes to 255; see [`SiteInfo`] #[serde(skip_serializing_if = "Option::is_none")] htpasswd_files: Option>, /// Default IP for if it's not specified in `socket_address_or_port` in [`SiteInfo`]. Defaults to localhost if not specified. #[serde(default = "default_default_ip")] default_ip: String, } /// Generates the default pub(crate) fn example_config() -> String { let mut subdomains: HashMap = HashMap::new(); subdomains.insert( "qbittorrent".to_string(), SiteInfo { aliases: vec!["qb".to_string()], address: "6011".to_string(), auth: None, conf_file: None, }, ); return serde_yml::to_string( &(Config { output_dir: default_output_dir(), domain: "example.net".to_string(), subdomains: subdomains, htpasswd_files: None, default_ip: default_default_ip(), }), ) .unwrap(); } // ----------------------------------------------------- DEFAULTS ----------------------------------------------------- fn default_output_dir() -> PathBuf { return PathBuf::from_str("conf.d").unwrap(); } fn default_default_ip() -> String { return "localhost".to_string(); }