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
use std::fmt::Debug;
use std::hash::Hash;
macro_rules! define_timeunit {
($($name: ident),*) => {
$(
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct $name;
impl TimeUnitTrait for $name {
#[inline]
fn unit() -> TimeUnit {
TimeUnit::$name
}
}
)*
/// Represents different units of time.
///
/// This enum includes various time units from years down to nanoseconds,
/// allowing for flexible time representations and calculations.
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum TimeUnit {
$($name),*
}
};
}
/// A trait for types representing time units.
///
/// This trait is implemented by types that represent specific units of time,
/// such as years, months, days, hours, etc. It provides a common interface
/// for these types and ensures they have certain properties and behaviors.
pub trait TimeUnitTrait: Copy + Clone + Debug + PartialEq + Eq + Hash + PartialOrd + Ord {
/// Returns the corresponding `TimeUnit` enum variant for this time unit.
///
/// # Returns
///
/// A `TimeUnit` enum variant representing the specific time unit.
fn unit() -> TimeUnit;
}
define_timeunit!(
Year,
Month,
Day,
Hour,
Minute,
Second,
Millisecond,
Microsecond,
Nanosecond
);
impl Default for TimeUnit {
#[inline]
fn default() -> Self {
TimeUnit::Nanosecond
}
}