use crate::cache::Cache;
use crate::lifecycle::{DefaultLifecycle, Lifecycle};
pub struct CacheBuilder<L: Lifecycle = DefaultLifecycle> {
max_size: usize,
shard_count: Option<usize>,
lifecycle: L,
}
impl CacheBuilder<DefaultLifecycle> {
pub fn new(max_size_bytes: usize) -> Self {
Self {
max_size: max_size_bytes,
shard_count: None,
lifecycle: DefaultLifecycle,
}
}
}
impl<L: Lifecycle> CacheBuilder<L> {
pub fn shards(mut self, count: usize) -> Self {
self.shard_count = Some(count);
self
}
pub fn lifecycle<L2: Lifecycle>(self, lifecycle: L2) -> CacheBuilder<L2> {
CacheBuilder {
max_size: self.max_size,
shard_count: self.shard_count,
lifecycle,
}
}
pub fn build(self) -> Cache<L> {
match self.shard_count {
Some(count) => Cache::with_shards_and_lifecycle(self.max_size, count, self.lifecycle),
None => Cache::with_lifecycle(self.max_size, self.lifecycle),
}
}
}
impl Default for CacheBuilder<DefaultLifecycle> {
fn default() -> Self {
Self::new(1024 * 1024 * 1024) }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_builder_default() {
let cache = CacheBuilder::new(1024).build();
assert!(cache.is_empty());
}
#[test]
fn test_builder_with_shards() {
let cache = CacheBuilder::new(1024).shards(32).build();
assert!(cache.is_empty());
}
#[test]
fn test_builder_full_config() {
let cache = CacheBuilder::new(10240).shards(32).build();
assert!(cache.is_empty());
assert_eq!(cache.size(), 0);
}
}