1#[derive(Clone, Copy, Debug)]
5pub struct Second(pub u32);
6
7#[derive(Clone, Copy, Debug)]
9pub struct Minute(pub u32);
10
11#[derive(Clone, Copy, Debug)]
13pub struct Hour(pub u32);
14
15#[derive(Clone, Copy, Debug)]
17pub struct Day(pub u32);
18
19#[derive(Clone, Copy, Debug)]
21pub struct DateInMonth(pub u32);
22
23#[derive(Clone, Copy, Debug)]
25pub struct Week(pub u32);
26
27#[derive(Clone, Copy, Debug)]
29pub struct Month(pub u32);
30
31#[derive(Clone, Copy, Debug)]
33pub struct Year(pub u32);
34
35pub trait U32Ext {
37 fn seconds(self) -> Second;
39 fn minutes(self) -> Minute;
41 fn hours(self) -> Hour;
43 fn day(self) -> Day;
45 fn date(self) -> DateInMonth;
47 fn month(self) -> Month;
49 fn year(self) -> Year;
51}
52
53impl U32Ext for u32 {
54 fn seconds(self) -> Second {
55 Second(self)
56 }
57
58 fn minutes(self) -> Minute {
59 Minute(self)
60 }
61
62 fn hours(self) -> Hour {
63 Hour(self)
64 }
65
66 fn day(self) -> Day {
67 Day(self)
68 }
69
70 fn date(self) -> DateInMonth {
71 DateInMonth(self)
72 }
73
74 fn month(self) -> Month {
75 Month(self)
76 }
77
78 fn year(self) -> Year {
79 Year(self)
80 }
81}
82
83#[derive(Clone,Copy,Debug)]
84pub struct Time {
85 pub hours: u32,
86 pub minutes: u32,
87 pub seconds: u32,
88 pub daylight_savings: bool
89}
90
91impl Time {
92 pub fn new(hours: Hour, minutes: Minute, seconds: Second, daylight_savings: bool) -> Self {
93 Self {
94 hours: hours.0,
95 minutes: minutes.0,
96 seconds: seconds.0,
97 daylight_savings: daylight_savings
98 }
99 }
100}
101
102#[derive(Clone,Copy, Debug)]
103pub struct Date {
104 pub day: u32,
105 pub date: u32,
106 pub month: u32,
107 pub year: u32,
108}
109
110impl Date {
111 pub fn new(day: Day, date: DateInMonth, month: Month, year: Year) -> Self {
112 Self {
113 day: day.0,
114 date: date.0,
115 month: month.0,
116 year: year.0
117 }
118 }
119}
120
121impl Into<Second> for Minute {
122 fn into(self) -> Second {
123 Second(self.0 * 60)
124 }
125}
126
127impl Into<Second> for Hour {
128 fn into(self) -> Second {
129 Second(self.0 * 3600)
130 }
131}
132
133macro_rules! impl_from_struct {
134 ($(
135 $type:ident: [ $($to:ident),+ ],
136 )+) => {
137 $(
138 $(
139 impl From <$type> for $to {
140 fn from(inner: $type) -> $to {
141 inner.0 as $to
142 }
143 }
144 )+
145 )+
146 }
147}
148
149macro_rules! impl_to_struct {
150 ($(
151 $type:ident: [ $($to:ident),+ ],
152 )+) => {
153 $(
154 $(
155 impl From <$type> for $to {
156 fn from(inner: $type) -> $to {
157 $to(inner as u32)
158 }
159 }
160 )+
161 )+
162 }
163}
164
165impl_from_struct!(
166 Hour: [u32, u16, u8],
167 Second: [u32, u16, u8],
168 Minute: [u32, u16, u8],
169 Day: [u32, u16, u8],
170 DateInMonth: [u32, u16, u8],
171 Month: [u32, u16, u8],
172 Year: [u32, u16, u8],
173);
174
175impl_to_struct!(
176 u32: [Hour, Minute, Second, Day, DateInMonth, Month, Year],
177 u16: [Hour, Minute, Second, Day, DateInMonth, Month, Year],
178 u8: [Hour, Minute, Second, Day, DateInMonth, Month, Year],
179);