pub use self::model::*;
use std::sync::Arc;
use url::Url;
mod error;
mod local_dir;
mod memory;
mod model;
#[cfg(test)]
mod tests;
pub use self::error::{StoreError, StoreResult};
use crate::memguard::weak::ZeroingWords;
pub trait BlockStore: Send + Sync {
fn node_id(&self) -> &str;
fn list_ring_ids(&self) -> StoreResult<Vec<String>>;
fn get_ring(&self, ring_id: &str) -> StoreResult<ZeroingWords>;
fn store_ring(&self, ring_id: &str, raw: &[u8]) -> StoreResult<()>;
fn change_logs(&self) -> StoreResult<Vec<ChangeLog>>;
fn get_index(&self, index_id: &str) -> StoreResult<Option<ZeroingWords>>;
fn store_index(&self, index_id: &str, raw: &[u8]) -> StoreResult<()>;
fn add_block(&self, raw: &[u8]) -> StoreResult<String>;
fn get_block(&self, block: &str) -> StoreResult<ZeroingWords>;
fn commit(&self, changes: &[Change]) -> StoreResult<()>;
}
pub fn open_block_store(url: &str, node_id: &str) -> StoreResult<Arc<dyn BlockStore>> {
let store_url = Url::parse(url)?;
match store_url.scheme() {
"file" => Ok(Arc::new(local_dir::LocalDirBlockStore::new(
store_url.to_file_path().unwrap(),
node_id,
)?)),
"memory" => Ok(Arc::new(memory::MemoryBlockStore::new(node_id))),
_ => Err(StoreError::InvalidStoreUrl(url.to_string())),
}
}