use std::collections::HashMap;
use std::io;
use std::sync::Mutex;
use crate::store::{AmbientSpec, Cred, CredStore};
#[derive(Default)]
pub struct MemoryCredStore {
creds: Mutex<HashMap<String, Cred>>,
ambient: Option<Cred>,
}
impl MemoryCredStore {
pub fn new() -> Self {
MemoryCredStore::default()
}
pub fn with(provider: &str, cred: Cred) -> Self {
let store = MemoryCredStore::new();
if let Ok(mut creds) = store.creds.lock() {
creds.insert(provider.to_owned(), cred);
}
store
}
pub fn with_ambient(cred: Cred) -> Self {
MemoryCredStore {
ambient: Some(cred),
..MemoryCredStore::default()
}
}
}
impl CredStore for MemoryCredStore {
fn get(&self, provider: &str) -> Option<Cred> {
self.creds.lock().ok()?.get(provider).cloned()
}
fn put(&self, provider: &str, cred: &Cred) -> io::Result<()> {
if let Ok(mut creds) = self.creds.lock() {
creds.insert(provider.to_owned(), cred.clone());
}
Ok(())
}
fn discover(&self, _spec: &AmbientSpec) -> Option<Cred> {
self.ambient.clone()
}
}