diff options
author | Quentin Dufour <quentin@deuxfleurs.fr> | 2023-11-02 12:18:43 +0100 |
---|---|---|
committer | Quentin Dufour <quentin@deuxfleurs.fr> | 2023-11-02 12:18:43 +0100 |
commit | 3b363b2a7803564231e001c215ab427c99c9435b (patch) | |
tree | 01322398a509142babfb60415315da4e0d4c6527 | |
parent | 553ea25f1854706b60ce6f087545968533ef6140 (diff) | |
download | aerogramme-3b363b2a7803564231e001c215ab427c99c9435b.tar.gz aerogramme-3b363b2a7803564231e001c215ab427c99c9435b.zip |
implement equality+cmp for builders based on url
-rw-r--r-- | src/login/mod.rs | 13 | ||||
-rw-r--r-- | src/mail/user.rs | 3 | ||||
-rw-r--r-- | src/storage/garage.rs | 8 | ||||
-rw-r--r-- | src/storage/in_memory.rs | 8 | ||||
-rw-r--r-- | src/storage/mod.rs | 43 |
5 files changed, 44 insertions, 31 deletions
diff --git a/src/login/mod.rs b/src/login/mod.rs index afade28..f4bf4d2 100644 --- a/src/login/mod.rs +++ b/src/login/mod.rs @@ -39,7 +39,7 @@ pub type ArcLoginProvider = Arc<dyn LoginProvider + Send + Sync>; #[derive(Clone, Debug)] pub struct Credentials { /// The storage credentials are used to authenticate access to the underlying storage (S3, K2V) - pub storage: Engine, + pub storage: Builders, /// The cryptographic keys are used to encrypt and decrypt data stored in S3 and K2V pub keys: CryptoKeys, } @@ -109,14 +109,11 @@ impl Region { impl Credentials { - pub fn k2v_client(&self) -> Result<RowStore> { - self.storage.row.row_store() + pub fn row_client(&self) -> Result<RowStore> { + Ok(self.storage.row_store()?) } - pub fn s3_client(&self) -> Result<S3Client> { - self.storage.s3_client() - } - pub fn bucket(&self) -> &str { - self.storage.bucket.as_str() + pub fn blob_client(&self) -> Result<BlobStore> { + Ok(self.storage.blob_store()?) } } diff --git a/src/mail/user.rs b/src/mail/user.rs index 5523c2a..2104455 100644 --- a/src/mail/user.rs +++ b/src/mail/user.rs @@ -13,6 +13,7 @@ use crate::mail::incoming::incoming_mail_watch_process; use crate::mail::mailbox::Mailbox; use crate::mail::uidindex::ImapUidvalidity; use crate::mail::unique_ident::{gen_ident, UniqueIdent}; +use crate::storage; use crate::time::now_msec; pub const MAILBOX_HIERARCHY_DELIMITER: char = '.'; @@ -455,6 +456,6 @@ enum CreatedMailbox { // ---- User cache ---- lazy_static! { - static ref USER_CACHE: std::sync::Mutex<HashMap<(String, StorageCredentials), Weak<User>>> = + static ref USER_CACHE: std::sync::Mutex<HashMap<(String, storage::Builders), Weak<User>>> = std::sync::Mutex::new(HashMap::new()); } 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<RowStore, StorageError> { unimplemented!(); } @@ -14,6 +14,10 @@ impl IBuilder for GrgCreds { fn blob_store(&self) -> Result<BlobStore, StorageError> { 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<RowStore, StorageError> { unimplemented!(); } @@ -15,6 +15,10 @@ impl IBuilder for FullMem { fn blob_store(&self) -> Result<BlobStore, StorageError> { 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<T, StorageError>>; + +// ----- Builders +pub trait IBuilders { + fn row_store(&self) -> Result<RowStore, StorageError>; + fn blob_store(&self) -> Result<BlobStore, StorageError>; + fn url(&self) -> &str; } -impl Clone for Engine { +pub type Builders = Box<dyn IBuilders + Send + Sync>; +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<T, StorageError>>; - -pub trait IBuilder { - fn row_store(&self) -> Result<RowStore, StorageError>; - fn blob_store(&self) -> Result<BlobStore, StorageError>; +impl PartialEq for Builders { + fn eq(&self, other: &Self) -> bool { + self.url() == other.url() + } +} +impl Eq for Builders {} +impl Hash for Builders { + fn hash<H: Hasher>(&self, state: &mut H) { + self.url().hash(state); + } } -pub type Builder = Box<dyn IBuilder + Send + Sync>; // ------ Row pub trait IRowStore |