1use server::config::{ConfigError, system_config};
2
3#[derive(Debug, Clone)]
8pub struct SshConnectInfo {
9 pub hostname: String,
10 pub port: u16,
11 pub host_fingerprint: String,
12}
13
14impl SshConnectInfo {
15 fn from_env() -> Self {
16 Self {
17 hostname: std::env::var("SSH_HOSTNAME")
18 .unwrap_or_else(|_| "ssh.example.invalid".to_string()),
19 port: std::env::var("SSH_PORT")
20 .ok()
21 .and_then(|raw| raw.parse::<u16>().ok())
22 .unwrap_or(2222),
23 host_fingerprint: std::env::var("SSH_HOST_FINGERPRINT")
24 .unwrap_or_else(|_| "(not configured)".to_string()),
25 }
26 }
27}
28
29pub fn env_override(raw: Option<String>) -> Option<String> {
38 raw.filter(|value| !value.trim().is_empty())
39}
40
41#[derive(Debug, Clone)]
42pub struct Config {
43 pub site_url: String,
44
45 pub redis_url: String,
46
47 pub access_token_max_age: i64,
50
51 pub refresh_token_max_age: i64,
52
53 pub ssh: SshConnectInfo,
54}
55
56impl Config {
57 pub async fn init() -> Result<Config, ConfigError> {
58 let site_url = system_config("site_url")
59 .await?
60 .ok_or(ConfigError::NoConfig("site_url".to_string()))?
61 .to_string();
62
63 let redis_url = match env_override(std::env::var("REDIS_URL").ok()) {
70 Some(url) => url,
71 None => system_config("redis_url")
72 .await?
73 .ok_or(ConfigError::NoConfig("redis_url".to_string()))?
74 .to_string(),
75 };
76
77 let access_token_max_age = system_config("access_token_maxage")
78 .await?
79 .ok_or(ConfigError::NoConfig("access_token_maxage".to_string()))?
80 .to_string();
81
82 let refresh_token_max_age = system_config("refresh_token_maxage")
83 .await?
84 .ok_or(ConfigError::NoConfig("refresh_token_maxage".to_string()))?
85 .to_string();
86
87 let parse_age = |raw: String, field: &str| {
88 raw.parse::<i64>()
89 .map_err(|_| ConfigError::NoConfig(field.to_string()))
90 };
91
92 Ok(Config {
93 site_url,
94 redis_url,
95 access_token_max_age: parse_age(access_token_max_age, "access_token_maxage")?,
96 refresh_token_max_age: parse_age(refresh_token_max_age, "refresh_token_maxage")?,
97 ssh: SshConnectInfo::from_env(),
98 })
99 }
100}