1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
use std::time::SystemTime;
/// Defines a boxed pointer to [`Clock`].
pub type ClockType = Box<dyn Clock + Send + Sync>;
/// The default implementation of the [`Clock`] trait. `SystemClock` is cloneable.
#[derive(Clone)]
pub struct SystemClock {}
/// BoxedClockClone represents a trait get an instance of [`ClockType`].
pub trait BoxedClockClone {
fn clone_box(&self) -> ClockType;
}
/// Clock represents a trait to get the current [`std::time::SystemTime`].
///
/// The default implementation of Clock is [`SystemClock`].
///
/// Clients can provide their implementation of Clock using [`crate::cache::config::Config`] and
/// since Clock is considered to be a lightweight object, Clock is of type [`BoxedClockClone`].
pub trait Clock: Send + Sync + BoxedClockClone {
fn now(&self) -> SystemTime;
fn has_passed(&self, time: &SystemTime) -> bool {
self.now().gt(time)
}
}
impl<T> BoxedClockClone for T
where
T: 'static + Clock + Clone {
fn clone_box(&self) -> ClockType {
Box::new(self.clone())
}
}
impl Clone for Box<dyn Clock> {
fn clone(&self) -> Box<dyn Clock> {
self.clone_box()
}
}
impl Clock for SystemClock {
fn now(&self) -> SystemTime {
SystemTime::now()
}
}
impl SystemClock {
/// Creates a new instance of SystemClock.
pub fn new() -> SystemClock {
SystemClock {}
}
/// Creates a boxed pointer to [`Clock`].
pub fn boxed() -> ClockType {
Box::new(SystemClock::new())
}
}
impl Default for SystemClock {
fn default() -> Self {
SystemClock::new()
}
}