use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum SecretStorage {
#[default]
Keychain,
EncryptedFile,
Memory,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum SecretBackupPolicy {
#[default]
Exclude,
EncryptedOnly,
Include,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum SecretPasswordSource {
Environment(String),
File(PathBuf),
Provided(String),
}
impl SecretPasswordSource {
pub fn resolve(&self) -> crate::Result<String> {
match self {
Self::Environment(var) => std::env::var(var).map_err(|_| {
crate::Error::Credential(format!("Environment variable '{var}' not found"))
}),
Self::File(path) => std::fs::read_to_string(path)
.map(|s| s.trim().to_string())
.map_err(|e| crate::Error::FileRead {
path: path.clone(),
source: e,
}),
Self::Provided(pass) => Ok(pass.clone()),
}
}
}