avro_rs/
duration.rs

1use byteorder::LittleEndian;
2use zerocopy::U32;
3
4/// A struct representing duration that hides the details of endianness and conversion between
5/// platform-native u32 and byte arrays.
6#[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    /// Construct a new `Duration`.
96    pub fn new(months: Months, days: Days, millis: Millis) -> Self {
97        Self {
98            months,
99            days,
100            millis,
101        }
102    }
103
104    /// Return the number of months in this duration.
105    pub fn months(&self) -> Months {
106        self.months
107    }
108
109    /// Return the number of days in this duration.
110    pub fn days(&self) -> Days {
111        self.days
112    }
113
114    /// Return the number of milliseconds in this duration.
115    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}