1use async_trait::async_trait;
2use std::fmt::Debug;
3use std::time::{Duration, Instant};
4
5#[async_trait]
6pub trait Time: Clone + Debug {
7 async fn sleep(&self, duration: Duration);
8
9 fn elapsed(&self, start: Instant) -> Duration;
10}
11
12#[derive(Clone, Debug)]
13pub struct DefaultTime;
14
15#[async_trait]
16impl Time for DefaultTime {
17 async fn sleep(&self, duration: Duration) {
18 tokio::time::sleep(duration).await;
19 }
20
21 fn elapsed(&self, start: Instant) -> Duration {
22 Duration::from_millis(start.elapsed().as_millis() as u64)
23 }
24}