#[cfg(feature = "ssr")] use std::fs::read_to_string; #[cfg(feature = "ssr")] use std::net::SocketAddr; #[cfg(feature = "ssr")] use std::str::FromStr; #[cfg(feature = "ssr")] use serde::Deserialize; #[cfg(feature = "ssr")] #[derive(Deserialize)] pub struct Network { bind_ip: String, port: u16 } #[cfg(feature = "ssr")] #[derive(Deserialize)] pub struct Session { key: String } #[cfg(feature = "ssr")] impl Session { pub fn key(&self) -> &[u8] { self.key.as_bytes() } } #[cfg(feature = "ssr")] impl Network { pub fn bind_address(&self) -> SocketAddr { SocketAddr::from_str(format!("{}:{}", &self.bind_ip, self.port).as_str()).expect("Can't parse bind IP address") } } #[cfg(feature = "ssr")] #[derive(Deserialize)] pub struct Database { user: String, password: String, db_name: String, host: String, port: Option } #[cfg(feature = "ssr")] impl Database { pub fn con_string(&self) -> String { format!("postgres://{}:{}@{}:{}/{}", self.user, self.password, self.host, self.port.unwrap_or(5432), self.db_name) } } #[cfg(feature = "ssr")] #[derive(Deserialize, Clone)] pub enum MailTransport { Smtp, File } #[cfg(feature = "ssr")] #[derive(Deserialize, Clone)] pub struct Mailing { transport: MailTransport, from: String, path: Option, server: Option, hello_name: Option, port: Option, user: Option, password: Option, tls: Option, accept_all_certs: Option } #[cfg(feature = "ssr")] impl Mailing { pub fn transport(&self) -> &MailTransport { &self.transport } pub fn from(&self) -> &str { &self.from } pub fn path(&self) -> &Option { &self.path } pub fn server(&self) -> &Option { &self.server } pub fn hello_name(&self) -> &Option { &self.hello_name } pub fn port(&self) -> Option { self.port } pub fn user(&self) -> &Option { &self.user } pub fn password(&self) -> &Option { &self.password } pub fn tls(&self) -> Option { self.tls } pub fn accept_all_certs(&self) -> Option { self.accept_all_certs } } #[cfg(feature = "ssr")] #[derive(Deserialize)] pub struct Logging { severity: String } #[cfg(feature = "ssr")] impl Logging { pub fn severity(&self) -> &str { &self.severity } } #[cfg(feature = "ssr")] #[derive(Deserialize)] pub struct Configuration { session: Session, network: Network, database: Database, mailing: Mailing, logging: Logging } #[cfg(feature = "ssr")] impl Configuration { pub fn session(&self) -> &Session { &self.session } pub fn network(&self) -> &Network { &self.network } pub fn database(&self) -> &Database { &self.database } pub fn mailing(&self) -> &Mailing { &self.mailing } pub fn logging(&self) -> &Logging { &self.logging } } #[cfg(feature = "ssr")] pub fn load_config(path: &str) -> Configuration { toml::from_str(read_to_string(path).expect("Can not open config file").as_str()).expect("Can not parse config file") }