use crate::formats::Manager;
use cdumay_core::define_errors;
use cdumay_error::InvalidConfiguration;
define_errors! {
VaultSecretError = InvalidConfiguration
}
#[derive(serde::Deserialize, Clone, Debug)]
pub struct VaultSecret {
alias: String,
key: String,
value: String,
}
impl VaultSecret {
pub fn new(alias: &str, key: &str, value: &str) -> Self {
Self {
alias: alias.to_string(),
key: key.to_string(),
value: value.to_string(),
}
}
}
#[derive(serde::Deserialize, Clone, Debug)]
pub struct VaultSecrets {
data: Vec<VaultSecret>,
}
impl VaultSecrets {
pub fn new(data: Vec<VaultSecret>) -> Self {
Self { data }
}
pub fn alias<C: serde::de::DeserializeOwned>(
&self,
name: String,
format: crate::ContentFormat,
context: &std::collections::BTreeMap<String, serde_value::Value>,
) -> cdumay_core::Result<C> {
let aliases: std::collections::BTreeMap<String, String> = self.data.clone().into_iter().map(|item| (item.alias, item.value)).collect();
match aliases.get(&name) {
Some(value) => match format {
crate::ContentFormat::JSON => crate::JsonManager::read_str(value, &context),
#[cfg(feature = "yaml")]
crate::ContentFormat::YAML => crate::YamlManager::read_str(value, &context),
#[cfg(feature = "xml")]
crate::ContentFormat::XML => crate::XmlManager::read_str(value, &context),
#[cfg(feature = "toml")]
crate::ContentFormat::TOML => crate::TomlManager::read_str(value, &context),
},
None => Err(VaultSecretError::new()
.with_message(format!("Invalid alias: {}", name))
.with_details(context.clone())
.into()),
}
}
}
#[derive(serde::Deserialize, Clone, Debug)]
pub struct VaultConfig {
pub secrets: Option<VaultSecrets>,
}
impl VaultConfig {
pub fn init(path: &str, context: &std::collections::BTreeMap<String, serde_value::Value>) -> cdumay_core::Result<VaultConfig> {
Ok(VaultConfig {
secrets: Some(VaultSecrets {
data: crate::JsonManager::new(path.to_string()).read_config(context)?,
}),
})
}
pub fn secrets(&self, context: &std::collections::BTreeMap<String, serde_value::Value>) -> cdumay_core::Result<VaultSecrets> {
match self.secrets.clone() {
None => Err(VaultSecretError::new()
.with_message("Failed to read vault data".to_string())
.with_details(context.clone())
.into()),
Some(secrets) => Ok(secrets),
}
}
}