Skip to main content

aa_storage_memory/
credential_store.rs

1//! In-memory [`CredentialStore`] backed by a `DashMap`.
2
3use std::sync::Arc;
4
5use aa_storage::{CredentialStore, Result, StorageError};
6use async_trait::async_trait;
7use dashmap::DashMap;
8
9/// A `DashMap`-backed [`CredentialStore`] mapping key strings to opaque secret
10/// bytes. Cloning shares the same underlying map.
11#[derive(Clone, Default)]
12pub struct MemoryCredentialStore {
13    secrets: Arc<DashMap<String, Vec<u8>>>,
14}
15
16impl MemoryCredentialStore {
17    /// Create an empty store.
18    pub fn new() -> Self {
19        Self::default()
20    }
21}
22
23#[async_trait]
24impl CredentialStore for MemoryCredentialStore {
25    async fn get_secret(&self, key: &str) -> Result<Vec<u8>> {
26        self.secrets
27            .get(key)
28            .map(|entry| entry.value().clone())
29            .ok_or_else(|| StorageError::NotFound(format!("secret {key}")))
30    }
31
32    async fn put_secret(&self, key: &str, value: Vec<u8>) -> Result<()> {
33        self.secrets.insert(key.to_owned(), value);
34        Ok(())
35    }
36
37    async fn delete_secret(&self, key: &str) -> Result<()> {
38        self.secrets.remove(key);
39        Ok(())
40    }
41}