use std::fmt;
use std::time::{SystemTime, UNIX_EPOCH};
pub trait Clock: Send + Sync {
fn now(&self) -> Result<u64, ClockError>;
}
#[derive(Debug)]
pub enum ClockError {
SystemTimeError,
}
impl fmt::Display for ClockError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
ClockError::SystemTimeError => write!(f, "System time error"),
}
}
}
impl std::error::Error for ClockError {}
#[derive(Debug, Clone)]
pub struct SystemClock;
impl Clock for SystemClock {
fn now(&self) -> Result<u64, ClockError> {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_nanos() as u64)
.map_err(|_| ClockError::SystemTimeError)
}
}