use super::backend_builder::BackendBuilder;
use crate::backend::MemoryBackend;
use crate::cache::Cache;
use crate::error::Result;
use std::marker::PhantomData;
use std::sync::Arc;
use std::time::Duration;
pub struct CacheBuilder<K, V> {
backend_builder: Option<BackendBuilder>,
ttl: Option<Duration>,
capacity: Option<u64>,
batch_writes: bool,
auto_promote: bool,
_phantom: PhantomData<(K, V)>,
}
impl<K, V> Default for CacheBuilder<K, V> {
fn default() -> Self {
Self {
backend_builder: None,
ttl: None,
capacity: None,
batch_writes: false,
auto_promote: true,
_phantom: PhantomData,
}
}
}
impl<K, V> CacheBuilder<K, V>
where
K: crate::traits::CacheKey,
V: crate::traits::Cacheable,
{
pub fn ttl(mut self, ttl: Duration) -> Self {
self.ttl = Some(ttl);
self
}
pub fn capacity(mut self, capacity: u64) -> Self {
self.capacity = Some(capacity);
self
}
pub fn batch_writes(mut self, enabled: bool) -> Self {
self.batch_writes = enabled;
self
}
pub fn auto_promote(mut self, enabled: bool) -> Self {
self.auto_promote = enabled;
self
}
pub fn backend(mut self, builder: BackendBuilder) -> Self {
self.backend_builder = Some(builder);
self
}
pub async fn build(self) -> Result<Cache<K, V>> {
let backend = if let Some(backend_builder) = self.backend_builder {
backend_builder.build().await?
} else {
let builder = MemoryBackend::builder();
let backend = if let Some(capacity) = self.capacity {
builder.capacity(capacity).build()
} else {
builder.build()
};
Arc::new(backend)
};
Ok(Cache::new_with_backend(backend))
}
}
#[cfg(test)]
mod tests {
use super::*;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, PartialEq)]
struct TestValue {
id: u64,
name: String,
}
#[tokio::test]
async fn test_cache_builder_default() {
let cache: Cache<String, TestValue> = CacheBuilder::default().build().await.unwrap();
assert!(cache.health_check().await.unwrap());
}
#[tokio::test]
async fn test_cache_builder_with_capacity() {
let cache: Cache<String, TestValue> = CacheBuilder::default()
.capacity(1000)
.build()
.await
.unwrap();
assert!(cache.health_check().await.unwrap());
}
#[tokio::test]
async fn test_cache_builder_with_ttl() {
let cache: Cache<String, TestValue> = CacheBuilder::default()
.ttl(Duration::from_secs(3600))
.build()
.await
.unwrap();
assert!(cache.health_check().await.unwrap());
}
}