1
1
use crate :: protocol:: ProtocolTypes ;
2
2
3
+ use byteorder:: { BigEndian , WriteBytesExt } ;
3
4
use nom:: bytes:: complete:: take;
4
5
use nom:: error:: { Error as NomError , ErrorKind } ;
5
- use nom:: number:: complete:: { be_i24, be_u24} ;
6
- use nom:: number:: complete:: { be_u128, be_u32} ;
6
+ use nom:: number:: complete:: { be_i24, be_u128, be_u24, be_u32} ;
7
7
use nom:: Err as NomErr ;
8
8
use nom:: IResult ;
9
9
use nom_derive:: * ;
@@ -19,6 +19,8 @@ use std::time::Duration;
19
19
pub enum DataNumber {
20
20
U8 ( u8 ) ,
21
21
U16 ( u16 ) ,
22
+ U24 ( u32 ) ,
23
+ I24 ( i32 ) ,
22
24
U32 ( u32 ) ,
23
25
U64 ( u64 ) ,
24
26
U128 ( u128 ) ,
@@ -47,8 +49,8 @@ impl DataNumber {
47
49
match field_length {
48
50
1 if !signed => Ok ( u8:: parse ( i) ?) . map ( |( i, j) | ( i, Self :: U8 ( j) ) ) ,
49
51
2 if !signed => Ok ( u16:: parse ( i) ?) . map ( |( i, j) | ( i, Self :: U16 ( j) ) ) ,
50
- 3 if !signed => Ok ( be_u24 ( i) . map ( |( i, j) | ( i, Self :: U32 ( j) ) ) ?) ,
51
- 3 if signed => Ok ( be_i24 ( i) . map ( |( i, j) | ( i, Self :: I32 ( j) ) ) ?) ,
52
+ 3 if !signed => Ok ( be_u24 ( i) . map ( |( i, j) | ( i, Self :: U24 ( j) ) ) ?) ,
53
+ 3 if signed => Ok ( be_i24 ( i) . map ( |( i, j) | ( i, Self :: I24 ( j) ) ) ?) ,
52
54
4 if signed => Ok ( i32:: parse ( i) ?) . map ( |( i, j) | ( i, Self :: I32 ( j) ) ) ,
53
55
4 if !signed => Ok ( u32:: parse ( i) ?) . map ( |( i, j) | ( i, Self :: U32 ( j) ) ) ,
54
56
8 if !signed => Ok ( u64:: parse ( i) ?) . map ( |( i, j) | ( i, Self :: U64 ( j) ) ) ,
@@ -61,6 +63,16 @@ impl DataNumber {
61
63
match self {
62
64
DataNumber :: U8 ( n) => n. to_be_bytes ( ) . to_vec ( ) ,
63
65
DataNumber :: U16 ( n) => n. to_be_bytes ( ) . to_vec ( ) ,
66
+ DataNumber :: U24 ( n) => {
67
+ let mut wtr = Vec :: new ( ) ;
68
+ wtr. write_u24 :: < BigEndian > ( * n) . unwrap ( ) ;
69
+ wtr
70
+ }
71
+ DataNumber :: I24 ( n) => {
72
+ let mut wtr = Vec :: new ( ) ;
73
+ wtr. write_i24 :: < BigEndian > ( * n) . unwrap ( ) ;
74
+ wtr
75
+ }
64
76
DataNumber :: U32 ( n) => n. to_be_bytes ( ) . to_vec ( ) ,
65
77
DataNumber :: U64 ( n) => n. to_be_bytes ( ) . to_vec ( ) ,
66
78
DataNumber :: U128 ( n) => n. to_be_bytes ( ) . to_vec ( ) ,
@@ -167,6 +179,8 @@ impl From<DataNumber> for usize {
167
179
fn from ( val : DataNumber ) -> Self {
168
180
match val {
169
181
DataNumber :: U8 ( i) => i as usize ,
182
+ DataNumber :: I24 ( i) => i as usize ,
183
+ DataNumber :: U24 ( i) => i as usize ,
170
184
DataNumber :: U32 ( i) => i as usize ,
171
185
DataNumber :: I32 ( i) => i as usize ,
172
186
DataNumber :: U16 ( i) => i as usize ,
@@ -222,3 +236,14 @@ pub enum FieldDataType {
222
236
ProtocolType ,
223
237
Unknown ,
224
238
}
239
+
240
+ #[ cfg( test) ]
241
+ mod common_tests {
242
+ #[ test]
243
+ fn it_tests_3_byte_data_number_exports ( ) {
244
+ use super :: DataNumber ;
245
+ let data = DataNumber :: parse ( & [ 1 , 246 , 118 ] , 3 , false ) . unwrap ( ) . 1 ;
246
+ println ! ( "{:?}" , data) ;
247
+ assert_eq ! ( data. to_be_bytes( ) , vec![ 1 , 246 , 118 ] ) ;
248
+ }
249
+ }
0 commit comments