use cachet::{Cache, CacheEntry, CacheServiceExt};
use layered::Layer;
use seatbelt::retry::Retry;
use seatbelt::{RecoveryInfo, ResilienceContext};
use tick::Clock;
#[tokio::main]
async fn main() {
let clock = Clock::new_tokio();
let context = ResilienceContext::new(&clock);
let cache = Cache::builder::<String, String>(clock).memory().build();
let retry_layer = Retry::layer("cache-retry", &context)
.clone_input()
.recovery_with(|res: &Result<_, _>, _| match res {
Ok(_) => RecoveryInfo::never(),
Err(_) => RecoveryInfo::retry(),
});
let cache_with_retry = retry_layer.layer(cache);
cache_with_retry
.insert("key".to_string(), CacheEntry::new("value".to_string()))
.await
.expect("insert failed");
let entry = cache_with_retry.get(&"key".to_string()).await.expect("get failed");
match entry {
Some(e) => println!("get(key): {}", e.value()),
None => println!("get(key): not found"),
}
}