bern_units/
time.rs

1//! Units representing time.
2
3use derive_more::{Add, Sub, Mul, Div};
4
5//#[derive(PartialEq, PartialOrd, Clone, Copy, Debug)]
6//pub struct MicroSecond(pub u64);
7
8#[derive(PartialEq, PartialOrd, Clone, Copy, Debug, Add, Sub, Mul, Div)]
9pub struct MilliSecond(pub u64);
10
11#[derive(PartialEq, PartialOrd, Clone, Copy, Debug, Add, Sub, Mul, Div)]
12pub struct Second(pub u64);
13
14#[derive(PartialEq, PartialOrd, Clone, Copy, Debug, Add, Sub, Mul, Div)]
15pub struct Minute(pub u64);
16
17#[derive(PartialEq, PartialOrd, Clone, Copy, Debug, Add, Sub, Mul, Div)]
18pub struct Hour(pub u64);
19
20#[derive(PartialEq, PartialOrd, Clone, Copy, Debug, Add, Sub, Mul, Div)]
21pub struct Day(pub u64);
22
23/// Second is implemented specifically because const trait implementations are not
24/// stable yet.
25impl MilliSecond {
26    pub const fn from_s(s: u64) -> Self {
27        MilliSecond(s * 1_000)
28    }
29
30    pub const fn from_min(min: u64) -> Self {
31        MilliSecond(min * 60 * 1_000)
32    }
33
34    pub const fn from_h(h: u64) -> Self {
35        MilliSecond(h * 60 * 60 * 1_000)
36    }
37
38    pub const fn from_d(d: u64) -> Self {
39        MilliSecond(d * 24 * 60 * 60 * 1_000)
40    }
41}
42
43/// Extension trait that adds convenience methods to the `u32` and `u64` type
44#[allow(non_snake_case)]
45pub trait ExtMilliSecond {
46    // Wrap in `MilliSecond`
47    fn ms(self) -> MilliSecond;
48
49    /// Wrap in `Second`
50    fn s(self) -> Second;
51
52    /// Wrap in `Minute`
53    fn min(self) -> Minute;
54
55    /// Wrap in `Hour`
56    fn h(self) -> Hour;
57
58    /// Wrap in `Day`
59    fn d(self) -> Day;
60}
61
62impl ExtMilliSecond for u32 {
63    fn ms(self) -> MilliSecond {
64        MilliSecond(self as u64)
65    }
66
67    fn s(self) -> Second {
68        Second(self as u64)
69    }
70
71    fn min(self) -> Minute {
72        Minute(self as u64)
73    }
74
75    fn h(self) -> Hour {
76        Hour(self as u64)
77    }
78
79    fn d(self) -> Day {
80        Day(self as u64)
81    }
82}
83
84impl ExtMilliSecond for u64 {
85    fn ms(self) -> MilliSecond {
86        MilliSecond(self)
87    }
88
89    fn s(self) -> Second {
90        Second(self)
91    }
92
93    fn min(self) -> Minute {
94        Minute(self)
95    }
96
97    fn h(self) -> Hour {
98        Hour(self)
99    }
100
101    fn d(self) -> Day {
102        Day(self)
103    }
104}
105
106
107impl From<u32> for MilliSecond {
108    fn from(ms: u32) -> Self {
109        (ms as u64).ms()
110    }
111}
112
113impl From<u64> for MilliSecond {
114    fn from(ms: u64) -> Self {
115        ms.ms()
116    }
117}
118
119
120impl From<Second> for MilliSecond {
121    fn from(s: Second) -> Self {
122        Self(s.0 * 1_000)
123    }
124}
125
126
127impl From<Minute> for MilliSecond {
128    fn from(min: Minute) -> Self {
129        Self(min.0 * 60 * 1_000)
130    }
131}
132
133impl From<Minute> for Second {
134    fn from(min: Minute) -> Self {
135        Self(min.0 * 60)
136    }
137}
138
139
140impl From<Hour> for MilliSecond {
141    fn from(h: Hour) -> Self {
142        Self(h.0 * 60 * 60 * 1_000)
143    }
144}
145
146impl From<Hour> for Second {
147    fn from(h: Hour) -> Self {
148        Self(h.0 * 60 * 60)
149    }
150}
151
152impl From<Hour> for Minute {
153    fn from(h: Hour) -> Self {
154        Self(h.0 * 60)
155    }
156}
157
158
159impl From<Day> for MilliSecond {
160    fn from(d: Day) -> Self {
161        Self(d.0 * 24 * 60 * 60 * 1_000)
162    }
163}
164
165impl From<Day> for Second {
166    fn from(d: Day) -> Self {
167        Self(d.0 * 24 * 60 * 60)
168    }
169}
170
171impl From<Day> for Minute {
172    fn from(d: Day) -> Self {
173        Self(d.0 * 24 * 60)
174    }
175}
176
177impl From<Day> for Hour {
178    fn from(d: Day) -> Self {
179        Self(d.0 * 24)
180    }
181}