@@ -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