mod circuit_breaker;
mod client;
pub mod config;
mod mailboxes;
mod messages;
mod metadata;
mod records;
#[cfg(test)]
mod tests;
pub use config::{AmatersConfig, ConsistencyLevel};
use crate::traits::{MailboxStore, MessageStore, MetadataStore, StorageBackend};
use client::AmatersClient;
use mailboxes::AmatersMailboxStore;
use messages::AmatersMessageStore;
use metadata::AmatersMetadataStore;
use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::Mutex;
pub(in crate::backends::amaters) type UidLockMap = Arc<Mutex<HashMap<String, Arc<Mutex<u32>>>>>;
pub struct AmatersBackend {
pub(in crate::backends::amaters) client: Arc<AmatersClient>,
pub(in crate::backends::amaters) config: AmatersConfig,
pub(in crate::backends::amaters) uid_locks: UidLockMap,
}
impl AmatersBackend {
pub async fn new(config: AmatersConfig) -> anyhow::Result<Self> {
let client = Arc::new(AmatersClient::new(config.clone()));
client.connect().await?;
client.init_keyspaces().await?;
Ok(Self {
client,
config,
uid_locks: Arc::new(Mutex::new(HashMap::new())),
})
}
#[cfg(feature = "amaters-backend")]
pub async fn connect_real(config: AmatersConfig) -> anyhow::Result<Self> {
let client = Arc::new(AmatersClient::new_real(&config).await?);
Ok(Self {
client,
config,
uid_locks: Arc::new(Mutex::new(HashMap::new())),
})
}
pub async fn init_schema(&self) -> anyhow::Result<()> {
self.client.init_keyspaces().await
}
}
impl StorageBackend for AmatersBackend {
fn mailbox_store(&self) -> Arc<dyn MailboxStore> {
Arc::new(AmatersMailboxStore {
client: self.client.clone(),
keyspace: self.config.metadata_keyspace.clone(),
})
}
fn message_store(&self) -> Arc<dyn MessageStore> {
Arc::new(AmatersMessageStore {
client: self.client.clone(),
metadata_keyspace: self.config.metadata_keyspace.clone(),
blob_keyspace: self.config.blob_keyspace.clone(),
uid_locks: self.uid_locks.clone(),
})
}
fn metadata_store(&self) -> Arc<dyn MetadataStore> {
Arc::new(AmatersMetadataStore {
client: self.client.clone(),
keyspace: self.config.metadata_keyspace.clone(),
})
}
}