use std::collections::HashMap;
use std::sync::RwLock;
use crate::error::{AccessError, AccessResult};
use crate::identity::{Did, Identity};
pub trait KeyDirectory {
fn published_key(&self, did: &Did) -> AccessResult<Option<Vec<u8>>>;
}
#[derive(Default)]
pub struct MemKeyDirectory {
keys: RwLock<HashMap<Did, Vec<u8>>>,
}
impl MemKeyDirectory {
pub fn new() -> Self {
Self::default()
}
pub fn publish(&self, identity: &Identity) -> AccessResult<()> {
self.publish_key(identity.did().clone(), identity.public_key().to_vec())
}
pub fn publish_key(&self, did: Did, public_sec1: Vec<u8>) -> AccessResult<()> {
self.keys
.write()
.map_err(|_| AccessError::Directory("lock poisoned".into()))?
.insert(did, public_sec1);
Ok(())
}
}
impl KeyDirectory for MemKeyDirectory {
fn published_key(&self, did: &Did) -> AccessResult<Option<Vec<u8>>> {
Ok(self
.keys
.read()
.map_err(|_| AccessError::Directory("lock poisoned".into()))?
.get(did)
.cloned())
}
}