use layered::{Execute, Service, Stack};
use seatbelt::ResilienceContext;
use seatbelt::fallback::Fallback;
use tick::Clock;
#[tokio::main]
async fn main() {
let clock = Clock::new_tokio();
let context = ResilienceContext::new(&clock);
let stack = (
Fallback::layer("my_fallback", &context)
.should_fallback(|output: &String| output.is_empty())
.fallback_output("fallback_value".to_string()),
Execute::new(execute_operation),
);
let service = stack.into_service();
for i in 0..10 {
let result = service.execute(format!("request-{i}")).await;
println!("{i}: result = '{result}'");
}
}
async fn execute_operation(input: String) -> String {
if fastrand::i16(0..10) < 3 {
String::default()
} else {
format!("processed:{input}")
}
}