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}