db_config 0.1.0

Define fields for vaults
Documentation
macro_rules! db_config_from_vault {
    ($($field:ident),*) => {
        use azure_vault_secrets::VaultStorage;
        use anyhow::Result;
        use serde::Serialize;

        #[derive(Serialize, Default)]
        pub struct DatabaseConfig {
            $(pub $field: String,)*
        }

        impl DatabaseConfig {
            /// Creates a new DatabaseConfig from vault secrets.
            ///
            /// The struct is defined using a macro.
            ///
            /// # Arguments
            ///
            /// * `vault` - The vault containing the database secrets
            ///
            /// # Returns
            ///
            /// * `Result<DatabaseConfig>` - The configured database config or an error
            ///
            /// # Errors
            ///
            /// Returns an error if any required field is missing from the vault
            pub fn from_vault(vault: &impl VaultStorage) -> Result<Self> {
                Ok(Self {
                    $($field: vault.get_required(&format!("db-{}", stringify!($field)))?,)*
                })
            }

            pub fn connection_string(&self) -> String {
                format!(
                    "postgres://{}@{}.{}/{}",
                    self.user, self.host, self.domain, self.name
                )
            }

            pub fn db_keys() -> Vec<String> {
                vec![$(format!("db-{}", stringify!($field))),*]
            }

            pub fn domain(&self) -> String {
                self.domain.clone()
            }

            pub fn host(&self) -> String {
                self.host.clone()
            }

            pub fn password(&self) -> String {
                self.pwd.clone()
            }
        }
    };
}

db_config_from_vault!(host, user, name, pwd, domain);