use std::future::Future;
use std::pin::Pin;
use zeph_common::secret::VaultError;
use crate::VaultProvider;
#[derive(Default)]
pub struct MockVaultProvider {
secrets: std::collections::BTreeMap<String, String>,
listed_only: Vec<String>,
}
impl MockVaultProvider {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn with_secret(mut self, key: &str, value: &str) -> Self {
self.secrets.insert(key.to_owned(), value.to_owned());
self
}
#[must_use]
pub fn with_listed_key(mut self, key: &str) -> Self {
self.listed_only.push(key.to_owned());
self
}
}
impl VaultProvider for MockVaultProvider {
fn get_secret(
&self,
key: &str,
) -> Pin<Box<dyn Future<Output = Result<Option<String>, VaultError>> + Send + '_>> {
let result = self.secrets.get(key).cloned();
Box::pin(async move { Ok(result) })
}
fn list_keys(&self) -> Vec<String> {
let mut keys: Vec<String> = self
.secrets
.keys()
.cloned()
.chain(self.listed_only.iter().cloned())
.collect();
keys.sort_unstable();
keys.dedup();
keys
}
}