#![deny(missing_docs)]
#![deny(rustdoc::broken_intra_doc_links)]
pub mod cache;
pub mod driver;
pub mod lock;
pub mod memory;
pub mod prefixed;
#[cfg(feature = "dynamodb")]
pub mod dynamodb;
#[cfg(feature = "memcached")]
pub mod memcached;
#[cfg(feature = "redis-driver")]
pub mod redis;
pub use cache::{Cache, CacheExt};
pub use driver::CacheDriver;
pub use lock::{Lock, LockGuard, LockManager};
pub use memory::MemoryCache;
pub use prefixed::PrefixedCache;
#[cfg(feature = "dynamodb")]
pub use dynamodb::DynamoDbCache;
#[cfg(feature = "memcached")]
pub use memcached::MemcachedCache;
#[cfg(feature = "redis-driver")]
pub use redis::RedisCache;
use std::sync::Arc;
#[derive(Clone)]
pub struct CacheManager {
store: Arc<dyn Cache>,
}
impl CacheManager {
pub fn new(store: Arc<dyn Cache>) -> Self {
Self { store }
}
pub fn memory() -> Self {
Self::new(Arc::new(MemoryCache::new()))
}
pub fn store(&self) -> &Arc<dyn Cache> {
&self.store
}
pub fn driver(&self) -> &str {
self.store.name()
}
}
impl std::ops::Deref for CacheManager {
type Target = Arc<dyn Cache>;
fn deref(&self) -> &Self::Target {
&self.store
}
}
impl std::fmt::Debug for CacheManager {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("CacheManager").field("driver", &self.driver()).finish()
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::time::Duration;
#[tokio::test]
async fn the_manager_delegates_to_its_store() {
let cache = CacheManager::memory();
cache.put_string("k", "v", None).await.unwrap();
assert_eq!(cache.get_string("k").await.unwrap().as_deref(), Some("v"));
assert_eq!(cache.driver(), "memory");
}
#[tokio::test]
async fn the_manager_reaches_the_typed_helpers_through_deref() {
let cache = CacheManager::memory();
cache.put_json("n", &vec![1u8, 2, 3], Some(Duration::from_secs(30))).await.unwrap();
assert_eq!(cache.get_json::<Vec<u8>>("n").await.unwrap(), Some(vec![1, 2, 3]));
}
#[tokio::test]
async fn a_prefixed_cache_can_be_the_manager() {
let shared: Arc<dyn Cache> = Arc::new(MemoryCache::new());
let cache = CacheManager::new(Arc::new(PrefixedCache::new(shared, "app")));
cache.put_string("k", "v", None).await.unwrap();
assert_eq!(cache.get_string("k").await.unwrap().as_deref(), Some("v"));
assert_eq!(cache.driver(), "memory", "the prefix is not a driver");
}
}