/* * * This abstraction goal is to leverage all the semantic of Garage K2V+S3, * to be as tailored as possible to it ; it aims to be a zero-cost abstraction * compared to when we where directly using the K2V+S3 client. * * My idea: we can encapsulate the causality token * into the object system so it is not exposed. */ use futures::future::BoxFuture; pub mod in_memory; pub mod garage; pub enum Selector<'a> { Range{ begin: &'a str, end: &'a str }, Filter(u64), } pub enum Alternative { Tombstone, Value(Vec), } type ConcurrentValues = Vec; #[derive(Debug)] pub enum StorageError { NotFound, Internal, } impl std::fmt::Display for StorageError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str("Storage Error: "); match self { Self::NotFound => f.write_str("Item not found"), Self::Internal => f.write_str("An internal error occured"), } } } impl std::error::Error for StorageError {} pub struct Engine { pub bucket: String, pub builders: Builder, } impl Clone for Engine { fn clone(&self) -> Self { Engine { bucket: "test".into(), builders: Box::new(in_memory::FullMem{}) } } } impl std::fmt::Debug for Engine { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("Engine").field("bucket", &self.bucket).finish() } } // Utils pub type AsyncResult<'a, T> = BoxFuture<'a, Result>; pub trait IBuilder { fn row_store(&self) -> Result; fn blob_store(&self) -> Result; } pub type Builder = Box; // ------ Row pub trait IRowStore { fn new_row(&self, partition: &str, sort: &str) -> RowRef; } pub type RowStore = Box; pub trait IRowRef { fn set_value(&self, content: Vec) -> RowValue; fn fetch(&self) -> AsyncResult; fn rm(&self) -> AsyncResult<()>; fn poll(&self) -> AsyncResult>; } pub type RowRef = Box; pub trait IRowValue { fn to_ref(&self) -> RowRef; fn content(&self) -> ConcurrentValues; fn push(&self) -> AsyncResult<()>; } pub type RowValue = Box; // ------- Blob pub trait IBlobStore { fn new_blob(&self, key: &str) -> BlobRef; fn list(&self) -> AsyncResult>; } pub type BlobStore = Box; pub trait IBlobRef { fn set_value(&self, content: Vec) -> BlobValue; fn fetch(&self) -> AsyncResult; fn copy(&self, dst: &BlobRef) -> AsyncResult<()>; fn rm(&self) -> AsyncResult<()>; } pub type BlobRef = Box; pub trait IBlobValue { fn to_ref(&self) -> BlobRef; fn push(&self) -> AsyncResult<()>; } pub type BlobValue = Box;