use std::collections::{HashMap, HashSet};
use duct::cmd;
use crate::provider::SecretProvider;
use lazy_settings::settings;
use eyre::Result;
#[settings(key = "doppler")]
struct DopplerSettings {
project: String,
environment: String,
}
pub struct DopplerProvider {
settings: DopplerSettings,
}
impl DopplerProvider {
pub fn new(instance_name: &str) -> Result<Self> {
Ok(Self {
settings: DopplerSettings::get(instance_name)?
})
}
}
impl SecretProvider for DopplerProvider {
fn get_keys(&self) -> Result<HashSet<String>> {
Ok(self.get_all()?.into_keys().collect())
}
fn get_all(&self) -> Result<HashMap<String, String>> {
let stdout = cmd!("doppler", "secrets", "-p", self.settings.project(), "download", "--no-fallback", "--no-cache", "--no-file", "-c", self.settings.environment()).read()?;
let map: HashMap<String, String> = serde_json::from_str(&stdout)?;
Ok(map)
}
fn set_all(&self, secrets: &HashMap<String, String>) -> Result<()> {
todo!()
}
fn remove_keys(&self) -> Result<()> {
todo!()
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_doppler() {
let settings = DopplerSettings::get("test").unwrap();
let provider = DopplerProvider {
settings
};
dbg!(provider.get_all().unwrap());
}
}