#![allow(dead_code)]
use data_encoding::BASE64_NOPAD;
use ring::digest;
use std::collections::HashMap;
use std::fmt;
use std::sync::RwLock;
lazy_static! {
static ref LOCAL_STORE: LocalStore = LocalStore::new();
}
pub(crate) fn get_global() -> &'static LocalStore {
&*LOCAL_STORE
}
#[derive(Debug)]
pub struct LocalStore {
store: RwLock<HashMap<String, Vec<u8>>>,
}
pub trait Store: fmt::Debug + Send + Sync {
fn insert(&self, key: &[u8]) -> String;
fn get_key(&self, id: &str) -> Option<Vec<u8>>;
}
impl LocalStore {
fn new() -> Self {
Self {
store: RwLock::new(HashMap::new()),
}
}
}
impl Store for LocalStore {
fn insert(&self, key: &[u8]) -> String {
let digest = digest::digest(&digest::SHA512_256, key);
let key_id = BASE64_NOPAD.encode(digest.as_ref());
let _ = self
.store
.write()
.expect("could not get write on key store")
.insert(key_id.clone(), key.to_vec());
key_id
}
fn get_key(&self, id: &str) -> Option<Vec<u8>> {
if let Some(v) = self
.store
.read()
.expect("could not get read lock on key store")
.get(id)
{
Some(v.clone())
} else {
None
}
}
}