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 66 67 68
use chrono::{DateTime, Local, Utc};
// Clock
/// A trait for getting the current time.
///
/// **This is supported on `feature=clock` only.**
/// # Examples
///
/// ```
/// use chrono::{DateTime, Duration, Utc};
/// use mockable::{Clock, DefaultClock, MockClock};
///
/// fn now(clock: &dyn Clock) -> DateTime<Utc> {
/// clock.utc()
/// }
///
/// // Default
/// let time = now(&DefaultClock);
///
/// // Mock
/// let expected = Utc::now();
/// let mut clock = MockClock::new();
/// clock
/// .expect_utc()
/// .returning(move || expected);
/// let time = now(&clock);
/// assert_eq!(time, expected);
/// ```
pub trait Clock: Send + Sync {
/// Returns the current time in the local timezone.
fn local(&self) -> DateTime<Local>;
/// Returns the current time in UTC.
fn utc(&self) -> DateTime<Utc>;
}
// DefaultClock
/// Default implementation of [`Clock`](trait.Clock.html).
///
/// **This is supported on `feature=clock` only.**
pub struct DefaultClock;
impl Clock for DefaultClock {
fn local(&self) -> DateTime<Local> {
Local::now()
}
fn utc(&self) -> DateTime<Utc> {
Utc::now()
}
}
// MockClock
#[cfg(feature = "mock")]
mockall::mock! {
/// `mockall` implementation of [`Clock`](trait.Clock.html).
///
/// **This is supported on `feature=clock,mock` only.**
pub Clock {}
impl Clock for Clock {
fn local(&self) -> DateTime<Local>;
fn utc(&self) -> DateTime<Utc>;
}
}