1use byteorder::LittleEndian;
2use zerocopy::U32;
3
4#[derive(Debug, Copy, Clone, PartialEq)]
7pub struct Duration {
8 months: Months,
9 days: Days,
10 millis: Millis,
11}
12
13#[derive(Debug, Copy, Clone, PartialEq)]
14pub struct Months(U32<LittleEndian>);
15
16impl Months {
17 pub fn new(months: u32) -> Self {
18 Self(U32::new(months))
19 }
20}
21
22impl From<Months> for u32 {
23 fn from(days: Months) -> Self {
24 days.0.get()
25 }
26}
27
28impl From<[u8; 4]> for Months {
29 fn from(bytes: [u8; 4]) -> Self {
30 Self(U32::from(bytes))
31 }
32}
33
34impl AsRef<[u8; 4]> for Months {
35 fn as_ref(&self) -> &[u8; 4] {
36 self.0.as_ref()
37 }
38}
39
40#[derive(Debug, Copy, Clone, PartialEq)]
41pub struct Days(U32<LittleEndian>);
42
43impl Days {
44 pub fn new(days: u32) -> Self {
45 Self(U32::new(days))
46 }
47}
48
49impl From<Days> for u32 {
50 fn from(days: Days) -> Self {
51 days.0.get()
52 }
53}
54
55impl From<[u8; 4]> for Days {
56 fn from(bytes: [u8; 4]) -> Self {
57 Self(U32::from(bytes))
58 }
59}
60
61impl AsRef<[u8; 4]> for Days {
62 fn as_ref(&self) -> &[u8; 4] {
63 self.0.as_ref()
64 }
65}
66
67#[derive(Debug, Copy, Clone, PartialEq)]
68pub struct Millis(U32<LittleEndian>);
69
70impl Millis {
71 pub fn new(millis: u32) -> Self {
72 Self(U32::new(millis))
73 }
74}
75
76impl From<Millis> for u32 {
77 fn from(days: Millis) -> Self {
78 days.0.get()
79 }
80}
81
82impl From<[u8; 4]> for Millis {
83 fn from(bytes: [u8; 4]) -> Self {
84 Self(U32::from(bytes))
85 }
86}
87
88impl AsRef<[u8; 4]> for Millis {
89 fn as_ref(&self) -> &[u8; 4] {
90 self.0.as_ref()
91 }
92}
93
94impl Duration {
95 pub fn new(months: Months, days: Days, millis: Millis) -> Self {
97 Self {
98 months,
99 days,
100 millis,
101 }
102 }
103
104 pub fn months(&self) -> Months {
106 self.months
107 }
108
109 pub fn days(&self) -> Days {
111 self.days
112 }
113
114 pub fn millis(&self) -> Millis {
116 self.millis
117 }
118}
119
120impl From<Duration> for [u8; 12] {
121 fn from(duration: Duration) -> Self {
122 let mut bytes = [0u8; 12];
123 bytes[0..4].copy_from_slice(duration.months.as_ref());
124 bytes[4..8].copy_from_slice(duration.days.as_ref());
125 bytes[8..12].copy_from_slice(duration.millis.as_ref());
126 bytes
127 }
128}
129
130impl From<[u8; 12]> for Duration {
131 fn from(bytes: [u8; 12]) -> Self {
132 Self {
133 months: Months::from([bytes[0], bytes[1], bytes[2], bytes[3]]),
134 days: Days::from([bytes[4], bytes[5], bytes[6], bytes[7]]),
135 millis: Millis::from([bytes[8], bytes[9], bytes[10], bytes[11]]),
136 }
137 }
138}