From 3b363b2a7803564231e001c215ab427c99c9435b Mon Sep 17 00:00:00 2001 From: Quentin Dufour Date: Thu, 2 Nov 2023 12:18:43 +0100 Subject: implement equality+cmp for builders based on url --- src/storage/garage.rs | 8 ++++++-- src/storage/in_memory.rs | 8 ++++++-- src/storage/mod.rs | 43 +++++++++++++++++++++++++------------------ 3 files changed, 37 insertions(+), 22 deletions(-) (limited to 'src/storage') diff --git a/src/storage/garage.rs b/src/storage/garage.rs index dfee88d..6dea00c 100644 --- a/src/storage/garage.rs +++ b/src/storage/garage.rs @@ -1,12 +1,12 @@ use crate::storage::*; -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Hash)] pub struct GrgCreds {} pub struct GrgStore {} pub struct GrgRef {} pub struct GrgValue {} -impl IBuilder for GrgCreds { +impl IBuilders for GrgCreds { fn row_store(&self) -> Result { unimplemented!(); } @@ -14,6 +14,10 @@ impl IBuilder for GrgCreds { fn blob_store(&self) -> Result { unimplemented!(); } + + fn url(&self) -> &str { + return "grg://unimplemented;" + } } impl IRowStore for GrgStore { diff --git a/src/storage/in_memory.rs b/src/storage/in_memory.rs index 80e7fdf..5cc8ef8 100644 --- a/src/storage/in_memory.rs +++ b/src/storage/in_memory.rs @@ -1,13 +1,13 @@ use futures::FutureExt; use crate::storage::*; -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Hash)] pub struct FullMem {} pub struct MemStore {} pub struct MemRef {} pub struct MemValue {} -impl IBuilder for FullMem { +impl IBuilders for FullMem { fn row_store(&self) -> Result { unimplemented!(); } @@ -15,6 +15,10 @@ impl IBuilder for FullMem { fn blob_store(&self) -> Result { unimplemented!(); } + + fn url(&self) -> &str { + return "mem://unimplemented;" + } } impl IRowStore for MemStore { diff --git a/src/storage/mod.rs b/src/storage/mod.rs index a2bdd43..0939463 100644 --- a/src/storage/mod.rs +++ b/src/storage/mod.rs @@ -8,6 +8,7 @@ * into the object system so it is not exposed. */ +use std::hash::{Hash, Hasher}; use futures::future::BoxFuture; pub mod in_memory; @@ -40,32 +41,38 @@ impl std::fmt::Display for StorageError { } impl std::error::Error for StorageError {} -pub struct Engine { - pub bucket: String, - pub builders: Builder, +// Utils +pub type AsyncResult<'a, T> = BoxFuture<'a, Result>; + +// ----- Builders +pub trait IBuilders { + fn row_store(&self) -> Result; + fn blob_store(&self) -> Result; + fn url(&self) -> &str; } -impl Clone for Engine { +pub type Builders = Box; +impl Clone for Builders { fn clone(&self) -> Self { - Engine { - bucket: "test".into(), - builders: Box::new(in_memory::FullMem{}) - } + // @FIXME write a real implementation with a box_clone function + Box::new(in_memory::FullMem{}) } } -impl std::fmt::Debug for Engine { +impl std::fmt::Debug for Builders { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("Engine").field("bucket", &self.bucket).finish() + f.write_str("aerogramme::storage::Builder") } } - -// Utils -pub type AsyncResult<'a, T> = BoxFuture<'a, Result>; - -pub trait IBuilder { - fn row_store(&self) -> Result; - fn blob_store(&self) -> Result; +impl PartialEq for Builders { + fn eq(&self, other: &Self) -> bool { + self.url() == other.url() + } +} +impl Eq for Builders {} +impl Hash for Builders { + fn hash(&self, state: &mut H) { + self.url().hash(state); + } } -pub type Builder = Box; // ------ Row pub trait IRowStore -- cgit v1.2.3