ars_server/
config.rs

1use std::{sync::Arc, path::{PathBuf, Path}};
2
3#[derive(Clone, serde::Deserialize, Debug)]
4pub struct SrvConfig<const P: u16> {
5    host: Option<Arc<str>>,
6    port: Option<u16>,
7    address: Option<Arc<str>>,
8    public_url: Option<Arc<str>>,
9    asset_package: PathBuf,
10}
11
12impl<const P: u16> SrvConfig<P> {
13    pub fn from_env(prefix: &str) -> envy::Result<Self> {
14        let mut cfg = envy::prefixed(prefix).from_env::<SrvConfig<P>>()?;
15        if cfg.address.is_none() {
16            let host = cfg.host.as_deref().unwrap_or("0.0.0.0");
17            let port = cfg.port.unwrap_or(P);
18            let address = format!("{}:{}", host, port);
19            cfg.address = Some(Arc::from(address));
20        }
21
22        if cfg.public_url.is_none() {
23            cfg.public_url = Some(Arc::from(format!("http://{}", cfg.address.as_deref().unwrap())));
24        }
25
26        Ok(cfg)
27    }
28
29    pub fn address(&self) -> &str {
30        self.address.as_deref().unwrap()
31    }
32
33    pub fn public_url(&self) -> &str {
34        self.public_url.as_deref().unwrap()
35    }
36
37    pub fn asset_package(&self) -> &Path {
38        self.asset_package.as_ref()
39    }
40}
41
42#[derive(Clone, serde::Deserialize, serde::Serialize, Debug)]
43#[serde(rename_all(serialize="camelCase"))]
44pub struct KeycloakConfig {
45    pub keycloak_url: Option<Arc<str>>,
46    pub keycloak_client_id: Option<Arc<str>>,
47    pub keycloak_realm: Option<Arc<str>>,
48}