use std::net::SocketAddr; use serde::Deserialize; #[derive(Deserialize, Debug)] pub struct Env { #[serde(default = "host_default")] pub host: String, #[serde(default = "port_default")] pub port: String, pub mysql_user: String, pub mysql_password: String, pub mysql_host: String, #[serde(default = "mysql_port_default")] pub mysql_port: String, #[serde(default = "mysql_database_default")] pub mysql_database: String, #[serde(default = "max_connections_default")] pub max_connections: u32, #[serde(default = "min_connections_default")] pub min_connections: u32, #[serde(default = "connect_timeout_default")] pub connect_timeout: u64, #[serde(default = "acquire_timeout_default")] pub acquire_timeout: u64, #[serde(default = "idle_timeout_default")] pub idle_timeout: u64, #[serde(default = "max_lifetime_default")] pub max_lifetime: u64, #[serde(default = "sqlx_logging_default")] pub sqlx_logging: bool, #[serde(default = "amf_informations_req")] pub amf_informations_req: String, #[serde(default = "amf_documents_path")] pub amf_documents_path: String, #[serde(default = "get_amf_transaction_interval")] pub get_amf_transaction_interval: u64, } fn host_default() -> String { "127.0.0.1".to_string() } fn port_default() -> String { "8000".to_string() } fn mysql_port_default() -> String { "3306".to_string() } fn mysql_database_default() -> String { "fast-insiders".to_string() } fn max_connections_default() -> u32 { 100 } fn min_connections_default() -> u32 { 5 } fn connect_timeout_default() -> u64 { 8 } fn acquire_timeout_default() -> u64 { 8 } fn idle_timeout_default() -> u64 { 8 } fn max_lifetime_default() -> u64 { 8 } fn sqlx_logging_default() -> bool { false } fn amf_documents_path() -> String { "https://bdif.amf-france.org/back/api/v1/documents/".to_string() } fn amf_informations_req() -> String { "https://bdif.amf-france.org/back/api/v1/informations?rechercheTexte=&typesInformation={{inf_type}}&from={{from}}&size={{size}}".to_string() } fn get_amf_transaction_interval() -> u64 { 3600 } impl Env { fn new() -> Self { if cfg!(debug_assertions) { // A .env file will only be loaded in a dev or debug environment dotenvy::dotenv().expect("Failed to load .env file"); } envy::from_env::().expect("Failed to load env") } } #[derive(Debug)] pub struct Config { pub server_address: SocketAddr, pub database_url: String, pub max_connections: u32, pub min_connections: u32, pub connect_timeout: u64, pub acquire_timeout: u64, pub idle_timeout: u64, pub max_lifetime: u64, pub sqlx_logging: bool, pub amf_informations_req: String, pub amf_documents_path: String, pub get_amf_transaction_interval: u64, } impl Config { pub fn new() -> Self { let env = Env::new(); let database_url = format!( "mysql://{}:{}@{}:{}/{}", env.mysql_user, env.mysql_password, env.mysql_host, env.mysql_port, env.mysql_database ); let server_address = format!("{}:{}", env.host, env.port) .parse() .expect("Could not parse host and port combination into a valid server address"); let mut config = Config { server_address, database_url, max_connections: env.max_connections, min_connections: env.min_connections, connect_timeout: env.connect_timeout, acquire_timeout: env.acquire_timeout, idle_timeout: env.idle_timeout, max_lifetime: env.max_lifetime, sqlx_logging: env.sqlx_logging, amf_informations_req: env.amf_informations_req, amf_documents_path: env.amf_documents_path, get_amf_transaction_interval: env.get_amf_transaction_interval, }; if config.amf_documents_path.chars().last().unwrap_or('/') != '/' { config.amf_documents_path.push('/'); } config } }