use std::cell::RefCell;
use std::collections::HashMap;
use crate::cbor::Cid;
use crate::mst::MstError;
pub trait BlockStore {
fn get_block(&self, cid: &Cid) -> Result<Vec<u8>, MstError>;
fn put_block(&self, cid: Cid, data: Vec<u8>) -> Result<(), MstError>;
fn has_block(&self, cid: &Cid) -> Result<bool, MstError>;
}
pub struct MemBlockStore {
blocks: RefCell<HashMap<Cid, Vec<u8>>>,
}
impl MemBlockStore {
pub fn new() -> Self {
MemBlockStore {
blocks: RefCell::new(HashMap::new()),
}
}
}
impl Default for MemBlockStore {
fn default() -> Self {
Self::new()
}
}
impl BlockStore for MemBlockStore {
fn get_block(&self, cid: &Cid) -> Result<Vec<u8>, MstError> {
self.blocks
.borrow()
.get(cid)
.cloned()
.ok_or_else(|| MstError::BlockNotFound(cid.to_string()))
}
fn put_block(&self, cid: Cid, data: Vec<u8>) -> Result<(), MstError> {
self.blocks.borrow_mut().insert(cid, data);
Ok(())
}
fn has_block(&self, cid: &Cid) -> Result<bool, MstError> {
Ok(self.blocks.borrow().contains_key(cid))
}
}