Skip to main content

chat_echo/
config.rs

1/// Configuration loaded from environment variables.
2pub 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
10/// Helper to extract a string from a JSON object, with default.
11fn 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
18/// Helper to extract an optional string from a JSON object.
19fn 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    /// Create a Config from a JSON value (used by the Plugin factory).
25    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}