Skip to content

Commit 100e405

Browse files
AbestanisAsgerWenneb
authored andcommitted
Add From and TryFrom implementations for Data (slowtec#26)
1 parent 632dcc8 commit 100e405

1 file changed

Lines changed: 90 additions & 0 deletions

File tree

src/frame/data.rs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,41 @@ impl<'d> Data<'d> {
6060
}
6161
}
6262

63+
/// The buffer has an invalid size (must be a non null multiple of 2).
64+
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
65+
pub struct DataFromBufferError;
66+
67+
impl<'buffer> TryFrom<&'buffer [u8]> for Data<'buffer> {
68+
type Error = DataFromBufferError;
69+
70+
fn try_from(value: &'buffer [u8]) -> Result<Self, Self::Error> {
71+
if value.is_empty() || value.len() % 2 != 0 {
72+
Err(DataFromBufferError)
73+
} else {
74+
Ok(Self {
75+
data: value,
76+
quantity: value.len() / 2,
77+
})
78+
}
79+
}
80+
}
81+
82+
macro_rules! derive_from_for_data {
83+
($($buffer_length: literal)+) => {
84+
$(
85+
impl<'buffer> From<&'buffer [u8; $buffer_length]> for Data<'buffer> {
86+
fn from(value: &'buffer [u8; $buffer_length]) -> Self {
87+
Self {
88+
data: value,
89+
quantity: $buffer_length / 2,
90+
}
91+
}
92+
}
93+
)+
94+
};
95+
}
96+
derive_from_for_data!(2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32);
97+
6398
/// Data iterator
6499
// TODO: crate a generic iterator
65100
#[cfg_attr(all(feature = "defmt", target_os = "none"), derive(defmt::Format))]
@@ -169,4 +204,59 @@ mod tests {
169204
assert!(data_iter.next().is_some());
170205
assert!(data_iter.next().is_none());
171206
}
207+
208+
#[test]
209+
fn data_try_from() {
210+
assert_eq!(
211+
Data::try_from(&[] as &[u8]),
212+
Err(DataFromBufferError),
213+
"Data from empty buffer is not allowed"
214+
);
215+
assert_eq!(
216+
Data::try_from(&[0u8] as &[u8]),
217+
Err(DataFromBufferError),
218+
"Data from buffer with length that is not a multiple of 2 is not allowed"
219+
);
220+
assert_eq!(
221+
Data::try_from(&[0u8, 1, 2] as &[u8]),
222+
Err(DataFromBufferError),
223+
"Data from buffer with length that is not a multiple of 2 is not allowed"
224+
);
225+
assert_eq!(
226+
Data::try_from(&[0u8, 1] as &[u8]),
227+
Ok(Data {
228+
data: &[0, 1],
229+
quantity: 1
230+
}),
231+
"Data from buffer with even length must succeed"
232+
);
233+
assert_eq!(
234+
Data::try_from(&0x1234_5678_u64.to_be_bytes() as &[u8]),
235+
Ok(Data {
236+
data: &0x1234_5678_u64.to_be_bytes(),
237+
quantity: 4
238+
}),
239+
"Data from buffer with even length must succeed"
240+
);
241+
}
242+
243+
#[test]
244+
fn data_from() {
245+
assert_eq!(
246+
Data::from(&[0u8, 1]),
247+
Data {
248+
data: &[0, 1],
249+
quantity: 1
250+
},
251+
"Data from buffer with even length must succeed"
252+
);
253+
assert_eq!(
254+
Data::from(&0x1234_5678_u64.to_be_bytes()),
255+
Data {
256+
data: &0x1234_5678_u64.to_be_bytes(),
257+
quantity: 4
258+
},
259+
"Data from buffer with even length must succeed"
260+
);
261+
}
172262
}

0 commit comments

Comments
 (0)