use std::env; use anyhow::{Result, Context, anyhow}; use log::*; pub struct DiplonatConfig { pub private_ip: String, pub consul_node_name: String, pub consul_url: String, pub refresh_time: u32, pub expiration_time: u32 } pub fn load_env() -> Result { let epi = "DIPLONAT_PRIVATE_IP"; let ert = "DIPLONAT_REFRESH_TIME"; let eet = "DIPLONAT_EXPIRATION_TIME"; let ecnd = "DIPLONAT_CONSUL_NODE_NAME"; let ecu = "DIPLONAT_CONSUL_URL"; let config = DiplonatConfig { consul_url: match env::var(ecu) { Ok(e) => e, Err(_) => "http://127.0.0.1:8500".to_string() }, private_ip: env::var(epi) .with_context(|| format!("{} env var must be defined, eg: 192.168.0.18", epi))?, refresh_time: env::var(ert) .with_context(|| format!("{} env var must be defined, eg: 60", ert))? .parse() .with_context(|| format!("{} env var must be an integer, eg: 60", ert))?, expiration_time: env::var(eet) .with_context(|| format!("{} env var must be defined, eg: 300", eet))? .parse() .with_context(|| format!("{} env var must be an integer, eg: 300", eet))?, consul_node_name: env::var(ecnd) .with_context(|| format!("{} env var must be defined", ecnd))? }; if config.refresh_time * 2 > config.expiration_time { return Err(anyhow!("Expiration time (currently: {}s) must be twice bigger than refresh time (currently: {}s)", config.expiration_time, config.refresh_time)) } info!("Consul URL: {}", config.consul_url); info!("Consul node name: {}", config.consul_node_name); info!("Private IP address: {}", config.private_ip); info!("Refresh time: {} seconds", config.refresh_time); info!("Expiration time: {} seconds", config.expiration_time); return Ok(config); }