qm-keycloak 0.0.2

Keycloak helper functions
Documentation
use std::sync::Arc;

#[derive(Default)]
pub struct ConfigBuilder<'a> {
    prefix: Option<&'a str>,
}

impl<'a> ConfigBuilder<'a> {
    pub fn with_prefix(mut self, prefix: &'a str) -> Self {
        self.prefix = Some(prefix);
        self
    }

    pub fn build(self) -> envy::Result<Config> {
        let mut cfg: Config = if let Some(prefix) = self.prefix {
            envy::prefixed(prefix)
        } else {
            envy::prefixed("KEYCLOAK_")
        }
        .from_env()?;
        if cfg.realm.is_none() {
            cfg.realm = Some("rmp".into());
        }
        if cfg.username.is_none() {
            cfg.username = Some("admin".into());
        }
        if cfg.password.is_none() {
            cfg.password = Some("admin".into());
        }
        if cfg.realm_admin_email.is_none() {
            cfg.realm_admin_email = Some("admin@test.local".into());
        }
        if cfg.realm_admin_username.is_none() {
            cfg.realm_admin_username = Some("admin".into());
        }
        if cfg.realm_admin_password.is_none() {
            cfg.realm_admin_password = Some("Admin123!".into());
        }
        if cfg.address.is_none() {
            let host = cfg.host.as_deref().unwrap_or("127.0.0.1");
            let port = cfg.port.unwrap_or(42210);
            cfg.address = Some(Arc::from(format!("http://{}:{}/", host, port)));
        }
        if cfg.smtp_starttls.is_none() {
            cfg.smtp_starttls = Some(false);
        }
        if cfg.smtp_port.is_none() {
            cfg.port = Some(1025);
        }
        if cfg.smtp_host.is_none() {
            cfg.smtp_host = Some("smtp".into());
        }
        if cfg.smtp_from.is_none() {
            cfg.smtp_from = Some("noreply@test.local".into());
        }
        if cfg.smtp_ssl.is_none() {
            cfg.smtp_ssl = Some(false);
        }
        Ok(cfg)
    }
}

#[derive(Clone, serde::Deserialize, Debug)]
pub struct Config {
    realm: Option<Arc<str>>,
    username: Option<Arc<str>>,
    password: Option<Arc<str>>,
    realm_admin_email: Option<Arc<str>>,
    realm_admin_username: Option<Arc<str>>,
    realm_admin_password: Option<Arc<str>>,
    port: Option<u16>,
    host: Option<Arc<str>>,
    address: Option<Arc<str>>,
    public_url: Option<Arc<str>>,
    smtp_reply_to_display_name: Option<Arc<str>>,
    smtp_starttls: Option<bool>,
    smtp_port: Option<u16>,
    smtp_host: Option<Arc<str>>,
    smtp_reply_to: Option<Arc<str>>,
    smtp_from: Option<Arc<str>>,
    smtp_from_display_name: Option<Arc<str>>,
    smtp_ssl: Option<bool>,
}

impl Config {
    pub fn new() -> envy::Result<Self> {
        ConfigBuilder::default().build()
    }

    pub fn builder<'a>() -> ConfigBuilder<'a> {
        ConfigBuilder::default()
    }

    pub fn realm(&self) -> &str {
        self.realm.as_deref().unwrap_or("rmp")
    }

    pub fn realm_admin_username(&self) -> &str {
        self.realm_admin_username.as_deref().unwrap_or("admin")
    }
    pub fn realm_admin_password(&self) -> &str {
        self.realm_admin_password.as_deref().unwrap_or("Admin123!")
    }
    pub fn realm_admin_email(&self) -> &str {
        self.realm_admin_email
            .as_deref()
            .unwrap_or("admin@test.local")
    }

    pub fn address(&self) -> &str {
        self.address.as_deref().unwrap_or("http://127.0.0.1:42210")
    }

    pub fn public_url(&self) -> &str {
        self.public_url.as_deref().unwrap_or("http://127.0.0.1:80")
    }

    pub fn username(&self) -> &str {
        self.username.as_deref().unwrap_or("admin")
    }

    pub fn password(&self) -> &str {
        self.password.as_deref().unwrap_or("admin")
    }

    pub fn smtp_reply_to_display_name(&self) -> Option<&str> {
        self.smtp_reply_to_display_name.as_deref()
    }

    pub fn smtp_starttls(&self) -> Option<&bool> {
        self.smtp_starttls.as_ref()
    }

    pub fn smtp_port(&self) -> Option<&u16> {
        self.smtp_port.as_ref()
    }

    pub fn smtp_host(&self) -> Option<&str> {
        self.smtp_host.as_deref()
    }

    pub fn smtp_reply_to(&self) -> Option<&str> {
        self.smtp_reply_to.as_deref()
    }

    pub fn smtp_from(&self) -> Option<&str> {
        self.smtp_from.as_deref()
    }

    pub fn smtp_from_display_name(&self) -> Option<&str> {
        self.smtp_from_display_name.as_deref()
    }

    pub fn smtp_ssl(&self) -> Option<&bool> {
        self.smtp_ssl.as_ref()
    }
}