use crate::error::DataError;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum SecretReferenceProvider {
Vault,
Kms,
Env,
}
#[derive(Debug, Clone)]
pub struct SecretReference {
pub provider: SecretReferenceProvider,
pub path: String,
pub field: Option<String>,
}
impl SecretReference {
pub fn parse(input: &str) -> Result<Self, DataError> {
if let Some(rest) = input.strip_prefix("vault://") {
let (path, field) = split_fragment(rest);
return Ok(SecretReference {
provider: SecretReferenceProvider::Vault,
path: path.to_string(),
field: field.map(str::to_string),
});
}
if let Some(rest) = input.strip_prefix("kms://") {
let (path, field) = split_fragment(rest);
return Ok(SecretReference {
provider: SecretReferenceProvider::Kms,
path: path.to_string(),
field: field.map(str::to_string),
});
}
if let Some(rest) = input.strip_prefix("env://") {
let (path, field) = split_fragment(rest);
return Ok(SecretReference {
provider: SecretReferenceProvider::Env,
path: path.to_string(),
field: field.map(str::to_string),
});
}
Err(DataError::InvalidSecretReference {
input: input.to_string(),
})
}
}
fn split_fragment(s: &str) -> (&str, Option<&str>) {
if let Some(idx) = s.find('#') {
(&s[..idx], Some(&s[idx + 1..]))
} else {
(s, None)
}
}