Skip to main content

cedros_admin/
config.rs

1use std::env;
2
3#[derive(Debug, Clone, PartialEq, Eq)]
4pub struct Config {
5    pub bind_addr: String,
6    pub login_upstream_url: Option<String>,
7    pub pay_upstream_url: Option<String>,
8}
9
10impl Config {
11    pub fn from_env() -> Self {
12        let bind_addr = env::var("CEDROS_ADMIN_BIND_ADDR")
13            .or_else(|_| env::var("PORT").map(|port| format!("127.0.0.1:{port}")))
14            .unwrap_or_else(|_| Self::default().bind_addr);
15
16        let login_upstream_url = env::var("CEDROS_ADMIN_LOGIN_UPSTREAM_URL")
17            .ok()
18            .and_then(normalize_optional_string);
19        let pay_upstream_url = env::var("CEDROS_ADMIN_PAY_UPSTREAM_URL")
20            .ok()
21            .and_then(normalize_optional_string);
22
23        Self {
24            bind_addr,
25            login_upstream_url,
26            pay_upstream_url,
27        }
28    }
29}
30
31impl Default for Config {
32    fn default() -> Self {
33        Self {
34            bind_addr: "127.0.0.1:8080".to_string(),
35            login_upstream_url: None,
36            pay_upstream_url: None,
37        }
38    }
39}
40
41fn normalize_optional_string(value: String) -> Option<String> {
42    let trimmed = value.trim();
43    if trimmed.is_empty() {
44        None
45    } else {
46        Some(trimmed.to_string())
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use super::Config;
53
54    #[test]
55    fn uses_default_bind_addr() {
56        let config = Config::default();
57
58        assert_eq!(config.bind_addr, "127.0.0.1:8080");
59        assert_eq!(config.login_upstream_url, None);
60        assert_eq!(config.pay_upstream_url, None);
61    }
62}