1use derive_more::{Add, Sub, Mul, Div};
4
5#[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
23impl 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#[allow(non_snake_case)]
45pub trait ExtMilliSecond {
46 fn ms(self) -> MilliSecond;
48
49 fn s(self) -> Second;
51
52 fn min(self) -> Minute;
54
55 fn h(self) -> Hour;
57
58 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}