diff options
author | Quentin Dufour <quentin@deuxfleurs.fr> | 2023-11-02 11:51:03 +0100 |
---|---|---|
committer | Quentin Dufour <quentin@deuxfleurs.fr> | 2023-11-02 11:51:03 +0100 |
commit | 553ea25f1854706b60ce6f087545968533ef6140 (patch) | |
tree | 9affda3665b1cbc6a7aca82cdc789555788321ba /src/storage/mod.rs | |
parent | 1f28832deaff3a2319cc88d5a83ffe506b784fc8 (diff) | |
download | aerogramme-553ea25f1854706b60ce6f087545968533ef6140.tar.gz aerogramme-553ea25f1854706b60ce6f087545968533ef6140.zip |
gradually implement our interface
Diffstat (limited to 'src/storage/mod.rs')
-rw-r--r-- | src/storage/mod.rs | 61 |
1 files changed, 46 insertions, 15 deletions
diff --git a/src/storage/mod.rs b/src/storage/mod.rs index c20853b..a2bdd43 100644 --- a/src/storage/mod.rs +++ b/src/storage/mod.rs @@ -25,20 +25,30 @@ pub enum Alternative { type ConcurrentValues = Vec<Alternative>; #[derive(Debug)] -pub enum Error { +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 row: RowBuilder, + pub builders: Builder, } impl Clone for Engine { fn clone(&self) -> Self { Engine { bucket: "test".into(), - row: Box::new(in_memory::MemCreds{}) + builders: Box::new(in_memory::FullMem{}) } } } @@ -48,24 +58,22 @@ impl std::fmt::Debug for Engine { } } -// A result -pub type AsyncResult<'a, T> = BoxFuture<'a, Result<T, Error>>; +// Utils +pub type AsyncResult<'a, T> = BoxFuture<'a, Result<T, StorageError>>; -// ------ Row Builder -pub trait IRowBuilder -{ - fn row_store(&self) -> Result<RowStore, Error>; +pub trait IBuilder { + fn row_store(&self) -> Result<RowStore, StorageError>; + fn blob_store(&self) -> Result<BlobStore, StorageError>; } -pub type RowBuilder = Box<dyn IRowBuilder + Send + Sync>; +pub type Builder = Box<dyn IBuilder + Send + Sync>; -// ------ Row Store +// ------ Row pub trait IRowStore { fn new_row(&self, partition: &str, sort: &str) -> RowRef; } -pub type RowStore = Box<dyn IRowStore>; +pub type RowStore = Box<dyn IRowStore + Sync + Send>; -// ------- Row Item pub trait IRowRef { fn set_value(&self, content: Vec<u8>) -> RowValue; @@ -73,7 +81,7 @@ pub trait IRowRef fn rm(&self) -> AsyncResult<()>; fn poll(&self) -> AsyncResult<Option<RowValue>>; } -type RowRef = Box<dyn IRowRef>; +pub type RowRef = Box<dyn IRowRef>; pub trait IRowValue { @@ -81,4 +89,27 @@ pub trait IRowValue fn content(&self) -> ConcurrentValues; fn push(&self) -> AsyncResult<()>; } -type RowValue = Box<dyn IRowValue>; +pub type RowValue = Box<dyn IRowValue>; + +// ------- Blob +pub trait IBlobStore +{ + fn new_blob(&self, key: &str) -> BlobRef; + fn list(&self) -> AsyncResult<Vec<BlobRef>>; +} +pub type BlobStore = Box<dyn IBlobStore + Send + Sync>; + +pub trait IBlobRef +{ + fn set_value(&self, content: Vec<u8>) -> BlobValue; + fn fetch(&self) -> AsyncResult<BlobValue>; + fn copy(&self, dst: &BlobRef) -> AsyncResult<()>; + fn rm(&self) -> AsyncResult<()>; +} +pub type BlobRef = Box<dyn IBlobRef>; + +pub trait IBlobValue { + fn to_ref(&self) -> BlobRef; + fn push(&self) -> AsyncResult<()>; +} +pub type BlobValue = Box<dyn IBlobValue>; |