1pub struct Config {
3 pub host: String,
4 pub port: u16,
5 pub bridge_url: String,
6 pub bridge_secret: Option<String>,
7 pub static_dir: String,
8}
9
10fn json_str(obj: &serde_json::Map<String, serde_json::Value>, key: &str, default: &str) -> String {
12 obj.get(key)
13 .and_then(|v| v.as_str())
14 .unwrap_or(default)
15 .to_string()
16}
17
18fn json_opt_str(obj: &serde_json::Map<String, serde_json::Value>, key: &str) -> Option<String> {
20 obj.get(key).and_then(|v| v.as_str()).map(String::from)
21}
22
23impl Config {
24 pub fn from_json(value: &serde_json::Value) -> Self {
26 let obj = value.as_object().cloned().unwrap_or_default();
27 Self {
28 host: json_str(&obj, "host", "0.0.0.0"),
29 port: obj.get("port").and_then(|v| v.as_u64()).unwrap_or(8080) as u16,
30 bridge_url: json_str(&obj, "bridge_url", "http://127.0.0.1:3100"),
31 bridge_secret: json_opt_str(&obj, "bridge_secret"),
32 static_dir: json_str(&obj, "static_dir", "./static"),
33 }
34 }
35
36 pub fn from_env() -> Self {
37 Self {
38 host: std::env::var("CHAT_ECHO_HOST").unwrap_or_else(|_| "0.0.0.0".into()),
39 port: std::env::var("CHAT_ECHO_PORT")
40 .ok()
41 .and_then(|p| p.parse().ok())
42 .unwrap_or(8080),
43 bridge_url: std::env::var("CHAT_ECHO_BRIDGE_URL")
44 .unwrap_or_else(|_| "http://127.0.0.1:3100".into()),
45 bridge_secret: std::env::var("CHAT_ECHO_BRIDGE_SECRET").ok(),
46 static_dir: std::env::var("CHAT_ECHO_STATIC_DIR").unwrap_or_else(|_| "./static".into()),
47 }
48 }
49}