use super::{ChainCache, ChainLink};
use crate::backend::BackendScore;
use crate::backend::CacheBackend;
use crate::core::EventPublisher;
use std::sync::Arc;
use std::sync::OnceLock;
use std::time::Duration;
#[derive(Default)]
pub struct ChainCacheBuilder {
links: Vec<ChainLink>,
backfill_enabled: bool,
race_read_enabled: bool,
default_ttl: Option<Duration>,
event_publisher: Option<Arc<dyn EventPublisher>>,
}
impl ChainCacheBuilder {
pub fn link(mut self, link: ChainLink) -> Self {
self.links.push(link);
self
}
pub fn links(mut self, mut links: Vec<ChainLink>) -> Self {
self.links.append(&mut links);
self
}
pub fn backend<B>(self, backend: B) -> Self
where
B: CacheBackend + BackendScore + 'static,
{
self.link(ChainLink::from_backend(backend))
}
pub fn default_time_to_live(mut self, ttl: Duration) -> Self {
self.default_ttl = Some(ttl);
self
}
pub fn enable_backfill(mut self) -> Self {
self.backfill_enabled = true;
self
}
pub fn disable_backfill(mut self) -> Self {
self.backfill_enabled = false;
self
}
pub fn enable_race_read(mut self) -> Self {
self.race_read_enabled = true;
self
}
pub fn disable_race_read(mut self) -> Self {
self.race_read_enabled = false;
self
}
pub fn event_publisher(mut self, publisher: Arc<dyn EventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn build(self) -> ChainCache {
let mut links = self.links;
links.sort_by_key(|link| std::cmp::Reverse(link.score()));
ChainCache {
links,
backfill_enabled: self.backfill_enabled,
race_read_enabled: self.race_read_enabled,
default_ttl: self.default_ttl,
sync_backends: OnceLock::new(),
event_publisher: self.event_publisher,
}
}
}