use chrono::{DateTime, Utc};
use std::fmt::Debug;
pub trait Clock: Send + Sync + Debug {
fn now(&self) -> DateTime<Utc>;
}
#[derive(Debug, Clone, Copy, Default)]
pub struct SystemClock;
impl Clock for SystemClock {
fn now(&self) -> DateTime<Utc> {
Utc::now()
}
}
#[cfg(test)]
pub use test_support::TestClock;
#[cfg(test)]
mod test_support {
use super::Clock;
use chrono::{DateTime, Duration, Utc};
use std::sync::{Arc, Mutex};
#[derive(Debug, Clone)]
pub struct TestClock(Arc<Mutex<DateTime<Utc>>>);
impl TestClock {
#[must_use]
pub fn new(now: DateTime<Utc>) -> Self {
Self(Arc::new(Mutex::new(now)))
}
pub fn set(&self, now: DateTime<Utc>) {
*self.0.lock().unwrap() = now;
}
pub fn advance(&self, duration: Duration) {
let mut guard = self.0.lock().unwrap();
*guard += duration;
}
}
impl Clock for TestClock {
fn now(&self) -> DateTime<Utc> {
*self.0.lock().unwrap()
}
}
}