use std::time::Duration;
use cachet::{Cache, CacheEntry, MockCache, TransformCodec, TransformEncoder, infallible};
use tick::Clock;
#[derive(Debug, Clone, Hash, Eq, PartialEq)]
struct CacheKey {
tenant: String,
resource_id: u64,
}
impl CacheKey {
fn new(tenant: impl Into<String>, resource_id: u64) -> Self {
Self {
tenant: tenant.into(),
resource_id,
}
}
fn to_flat_key(&self) -> String {
format!("{}:{}", self.tenant, self.resource_id)
}
}
#[tokio::main]
async fn main() {
let clock = Clock::new_tokio();
let l2 = Cache::builder::<String, String>(clock.clone())
.storage(MockCache::new())
.ttl(Duration::from_secs(300));
let cache = Cache::builder::<CacheKey, String>(clock)
.memory()
.ttl(Duration::from_secs(60))
.transform(
TransformEncoder::infallible(|k: &CacheKey| k.to_flat_key()),
TransformCodec::new(infallible(|v: &String| v.clone()), infallible(|v: &String| v.clone())),
)
.fallback(l2)
.build();
let key = CacheKey::new("acme", 42);
cache
.insert(key.clone(), CacheEntry::new("widget-data".to_string()))
.await
.expect("insert failed");
let result = cache.get(&key).await.expect("get failed");
match result {
Some(entry) => println!("got: {}", entry.value()),
None => println!("not found"),
}
println!("done");
}