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}