cedros-admin-server 0.1.0

Shared admin server shell for Cedros admin composition
Documentation
use std::env;

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Config {
    pub bind_addr: String,
    pub login_upstream_url: Option<String>,
    pub pay_upstream_url: Option<String>,
}

impl Config {
    pub fn from_env() -> Self {
        let bind_addr = env::var("CEDROS_ADMIN_BIND_ADDR")
            .or_else(|_| env::var("PORT").map(|port| format!("127.0.0.1:{port}")))
            .unwrap_or_else(|_| Self::default().bind_addr);

        let login_upstream_url = env::var("CEDROS_ADMIN_LOGIN_UPSTREAM_URL")
            .ok()
            .and_then(normalize_optional_string);
        let pay_upstream_url = env::var("CEDROS_ADMIN_PAY_UPSTREAM_URL")
            .ok()
            .and_then(normalize_optional_string);

        Self {
            bind_addr,
            login_upstream_url,
            pay_upstream_url,
        }
    }
}

impl Default for Config {
    fn default() -> Self {
        Self {
            bind_addr: "127.0.0.1:8080".to_string(),
            login_upstream_url: None,
            pay_upstream_url: None,
        }
    }
}

fn normalize_optional_string(value: String) -> Option<String> {
    let trimmed = value.trim();
    if trimmed.is_empty() {
        None
    } else {
        Some(trimmed.to_string())
    }
}

#[cfg(test)]
mod tests {
    use super::Config;

    #[test]
    fn uses_default_bind_addr() {
        let config = Config::default();

        assert_eq!(config.bind_addr, "127.0.0.1:8080");
        assert_eq!(config.login_upstream_url, None);
        assert_eq!(config.pay_upstream_url, None);
    }
}