use std::collections::BTreeMap;
use base64::Engine;
use serde::{Deserialize, Serialize};
use crate::primitives::Authenticator;
#[derive(Debug, Default, Clone, Serialize, Deserialize)]
#[serde(transparent)]
pub struct Registry {
inner: BTreeMap<String, serde_json::Value>,
}
impl Registry {
pub fn new() -> Self {
Self::default()
}
pub fn insert<A: Authenticator>(
&mut self,
credential_id: &[u8],
public_key: &A::PublicKey,
) -> crate::Result<()> {
let key = base64::engine::general_purpose::STANDARD.encode(credential_id);
let value = serde_json::to_value(public_key)
.map_err(|_| crate::Error::Encoding("Authenticator::PublicKey→Value"))?;
self.inner.insert(key, value);
Ok(())
}
pub fn get<A: Authenticator>(
&self,
credential_id: &[u8],
) -> crate::Result<Option<A::PublicKey>> {
let key = base64::engine::general_purpose::STANDARD.encode(credential_id);
match self.inner.get(&key) {
None => Ok(None),
Some(v) => serde_json::from_value(v.clone())
.map(Some)
.map_err(|_| crate::Error::Encoding("Value→Authenticator::PublicKey")),
}
}
pub fn remove(&mut self, credential_id: &[u8]) -> bool {
let key = base64::engine::general_purpose::STANDARD.encode(credential_id);
self.inner.remove(&key).is_some()
}
pub fn len(&self) -> usize {
self.inner.len()
}
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
}