use config::{Config, ConfigError, Environment, File}; use serde::{Deserialize, Serialize}; mod auth; mod cors; mod grpc; mod log; mod nginx; pub use auth::*; pub use cors::*; pub use grpc::*; pub use log::*; pub use nginx::*; pub type ValidationError = String; pub trait Validate { fn validate(&self) -> Result<(), ValidationError>; } /// Agent settings #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Settings { pub agent_id: String, pub grpc: GrpcSettings, #[serde(default)] pub log: LogSettings, #[serde(default)] pub nginx: NginxSettings, } impl Validate for Settings { fn validate(&self) -> Result<(), ValidationError> { self.grpc.validate()?; self.nginx.validate()?; Ok(()) } } impl Settings { /// Load settings from config files and environment pub fn load() -> Result { let run_mode = std::env::var("RUN_MODE").unwrap_or_else(|_| "development".into()); let settings = Config::builder() .add_source(File::with_name("config/default").required(false)) .add_source(File::with_name(&format!("config/{}", run_mode)).required(false)) .add_source(File::with_name("config/agent/default").required(false)) .add_source(File::with_name(&format!("config/agent/{}", run_mode)).required(false)) .add_source(Environment::with_prefix("NXMESH").separator("__")) .build()?; let mut settings: Self = settings.try_deserialize()?; settings.validate().map_err(ConfigError::Message)?; settings.nginx.validate().map_err(ConfigError::Message)?; settings.nginx.transform_commands(); Ok(settings) } } #[cfg(test)] mod tests { use super::*; #[test] fn test_ensure_send_and_sync() { fn assert_send_sync() {} assert_send_sync::(); } }