use std::sync::atomic::{AtomicU32, Ordering};
use std::time::Duration;
use processkit::{Command, RestartPolicy, Supervisor};
#[tokio::main]
async fn main() -> processkit::Result<()> {
let command = Command::new("cargo").arg("--version");
let runs_seen = AtomicU32::new(0);
let outcome = Supervisor::new(command)
.restart(RestartPolicy::Always)
.backoff(Duration::from_millis(50), 2.0)
.max_backoff(Duration::from_millis(200))
.max_restarts(20) .stop_when(move |_| runs_seen.fetch_add(1, Ordering::SeqCst) == 4)
.run()
.await?;
println!("stopped: {:?}", outcome.stopped);
println!("restarts: {}", outcome.restarts);
println!("storm pauses: {}", outcome.storm_pauses);
println!("final exit code: {:?}", outcome.final_result.code());
Ok(())
}