@@ -13,6 +13,43 @@ use std::convert::Into;
13
13
use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr } ;
14
14
use std:: time:: Duration ;
15
15
16
+ macro_rules! impl_try_from_data_number {
17
+ ( $( $t: ty => $v: ident) ,* ) => {
18
+ $(
19
+ impl TryFrom <& DataNumber > for $t {
20
+ type Error = DataNumberError ;
21
+
22
+ fn try_from( val: & DataNumber ) -> Result <Self , Self :: Error > {
23
+ match val {
24
+ DataNumber :: $v( i) => Ok ( * i) ,
25
+ _ => Err ( DataNumberError :: InvalidDataType ) ,
26
+ }
27
+ }
28
+ }
29
+ ) *
30
+ } ;
31
+ }
32
+
33
+ macro_rules! impl_try_from_field_value {
34
+ ( $( $t: ty => $v: ident) ,* ) => {
35
+ $(
36
+ impl TryFrom <& FieldValue > for $t {
37
+ type Error = FieldValueError ;
38
+
39
+ fn try_from( value: & FieldValue ) -> Result <Self , Self :: Error > {
40
+ match value {
41
+ FieldValue :: DataNumber ( d) => {
42
+ let d: $t = d. try_into( ) . map_err( |_| FieldValueError :: InvalidDataType ) ?;
43
+ Ok ( d)
44
+ }
45
+ _ => Err ( FieldValueError :: InvalidDataType ) ,
46
+ }
47
+ }
48
+ }
49
+ ) *
50
+ } ;
51
+ }
52
+
16
53
/// Holds our datatypes and values post parsing
17
54
#[ derive( Debug , PartialEq , Eq , PartialOrd , Ord , Clone , Serialize ) ]
18
55
#[ serde( untagged) ]
@@ -32,68 +69,44 @@ pub enum DataNumberError {
32
69
InvalidDataType ,
33
70
}
34
71
35
- impl TryFrom < & DataNumber > for u8 {
36
- type Error = DataNumberError ;
37
-
38
- fn try_from ( val : & DataNumber ) -> Result < Self , Self :: Error > {
39
- match val {
40
- DataNumber :: U8 ( i) => Ok ( * i) ,
41
- _ => Err ( DataNumberError :: InvalidDataType ) ,
42
- }
43
- }
44
- }
45
-
46
- impl TryFrom < & DataNumber > for u16 {
47
- type Error = DataNumberError ;
48
-
49
- fn try_from ( val : & DataNumber ) -> Result < Self , Self :: Error > {
50
- match val {
51
- DataNumber :: U16 ( i) => Ok ( * i) ,
52
- _ => Err ( DataNumberError :: InvalidDataType ) ,
53
- }
54
- }
55
- }
72
+ impl_try_from_data_number ! (
73
+ u8 => U8 ,
74
+ u16 => U16 ,
75
+ u32 => U32 ,
76
+ i32 => I32 ,
77
+ u64 => U64 ,
78
+ u128 => U128
79
+ ) ;
80
+
81
+ impl_try_from_field_value ! (
82
+ u8 => DataNumber ,
83
+ u16 => DataNumber ,
84
+ u32 => DataNumber ,
85
+ i32 => DataNumber ,
86
+ u64 => DataNumber ,
87
+ u128 => DataNumber
88
+ ) ;
56
89
57
- impl TryFrom < & DataNumber > for u32 {
58
- type Error = DataNumberError ;
59
-
60
- fn try_from ( val : & DataNumber ) -> Result < Self , Self :: Error > {
61
- match val {
62
- DataNumber :: U32 ( i) => Ok ( * i) ,
63
- _ => Err ( DataNumberError :: InvalidDataType ) ,
64
- }
65
- }
66
- }
67
-
68
- impl TryFrom < & DataNumber > for i32 {
69
- type Error = DataNumberError ;
70
-
71
- fn try_from ( val : & DataNumber ) -> Result < Self , Self :: Error > {
72
- match val {
73
- DataNumber :: I32 ( i) => Ok ( * i) ,
74
- _ => Err ( DataNumberError :: InvalidDataType ) ,
75
- }
76
- }
77
- }
78
-
79
- impl TryFrom < & DataNumber > for u64 {
80
- type Error = DataNumberError ;
90
+ impl TryFrom < & FieldValue > for String {
91
+ type Error = FieldValueError ;
81
92
82
- fn try_from ( val : & DataNumber ) -> Result < Self , Self :: Error > {
83
- match val {
84
- DataNumber :: U64 ( i) => Ok ( * i) ,
85
- _ => Err ( DataNumberError :: InvalidDataType ) ,
93
+ fn try_from ( value : & FieldValue ) -> Result < Self , Self :: Error > {
94
+ match value {
95
+ FieldValue :: String ( s) => Ok ( s. clone ( ) ) ,
96
+ FieldValue :: MacAddr ( s) => Ok ( s. to_string ( ) ) ,
97
+ _ => Err ( FieldValueError :: InvalidDataType ) ,
86
98
}
87
99
}
88
100
}
89
101
90
- impl TryFrom < & DataNumber > for u128 {
91
- type Error = DataNumberError ;
102
+ impl TryFrom < & FieldValue > for IpAddr {
103
+ type Error = FieldValueError ;
92
104
93
- fn try_from ( val : & DataNumber ) -> Result < Self , Self :: Error > {
94
- match val {
95
- DataNumber :: U128 ( i) => Ok ( * i) ,
96
- _ => Err ( DataNumberError :: InvalidDataType ) ,
105
+ fn try_from ( value : & FieldValue ) -> Result < Self , Self :: Error > {
106
+ match value {
107
+ FieldValue :: Ip4Addr ( ip) => Ok ( IpAddr :: V4 ( * ip) ) ,
108
+ FieldValue :: Ip6Addr ( ip) => Ok ( IpAddr :: V6 ( * ip) ) ,
109
+ _ => Err ( FieldValueError :: InvalidDataType ) ,
97
110
}
98
111
}
99
112
}
@@ -281,114 +294,6 @@ pub enum FieldValueError {
281
294
InvalidDataType ,
282
295
}
283
296
284
- impl TryFrom < & FieldValue > for String {
285
- type Error = FieldValueError ;
286
-
287
- fn try_from ( value : & FieldValue ) -> Result < Self , Self :: Error > {
288
- match value {
289
- FieldValue :: String ( s) => Ok ( s. clone ( ) ) ,
290
- FieldValue :: MacAddr ( s) => Ok ( s. to_string ( ) ) ,
291
- _ => Err ( FieldValueError :: InvalidDataType ) ,
292
- }
293
- }
294
- }
295
-
296
- impl TryFrom < & FieldValue > for IpAddr {
297
- type Error = FieldValueError ;
298
-
299
- fn try_from ( value : & FieldValue ) -> Result < Self , Self :: Error > {
300
- match value {
301
- FieldValue :: Ip4Addr ( ip) => Ok ( IpAddr :: V4 ( * ip) ) ,
302
- FieldValue :: Ip6Addr ( ip) => Ok ( IpAddr :: V6 ( * ip) ) ,
303
- _ => Err ( FieldValueError :: InvalidDataType ) ,
304
- }
305
- }
306
- }
307
-
308
- impl TryFrom < & FieldValue > for u8 {
309
- type Error = FieldValueError ;
310
-
311
- fn try_from ( value : & FieldValue ) -> Result < Self , Self :: Error > {
312
- match value {
313
- FieldValue :: DataNumber ( d) => {
314
- let d: u8 = d. try_into ( ) . map_err ( |_| FieldValueError :: InvalidDataType ) ?;
315
- Ok ( d)
316
- }
317
- _ => Err ( FieldValueError :: InvalidDataType ) ,
318
- }
319
- }
320
- }
321
-
322
- impl TryFrom < & FieldValue > for u16 {
323
- type Error = FieldValueError ;
324
-
325
- fn try_from ( value : & FieldValue ) -> Result < Self , Self :: Error > {
326
- match value {
327
- FieldValue :: DataNumber ( d) => {
328
- let d: u16 = d. try_into ( ) . map_err ( |_| FieldValueError :: InvalidDataType ) ?;
329
- Ok ( d)
330
- }
331
- _ => Err ( FieldValueError :: InvalidDataType ) ,
332
- }
333
- }
334
- }
335
-
336
- impl TryFrom < & FieldValue > for u32 {
337
- type Error = FieldValueError ;
338
-
339
- fn try_from ( value : & FieldValue ) -> Result < Self , Self :: Error > {
340
- match value {
341
- FieldValue :: DataNumber ( d) => {
342
- let d: u32 = d. try_into ( ) . map_err ( |_| FieldValueError :: InvalidDataType ) ?;
343
- Ok ( d)
344
- }
345
- _ => Err ( FieldValueError :: InvalidDataType ) ,
346
- }
347
- }
348
- }
349
-
350
- impl TryFrom < & FieldValue > for i32 {
351
- type Error = FieldValueError ;
352
-
353
- fn try_from ( value : & FieldValue ) -> Result < Self , Self :: Error > {
354
- match value {
355
- FieldValue :: DataNumber ( d) => {
356
- let d: i32 = d. try_into ( ) . map_err ( |_| FieldValueError :: InvalidDataType ) ?;
357
- Ok ( d)
358
- }
359
- _ => Err ( FieldValueError :: InvalidDataType ) ,
360
- }
361
- }
362
- }
363
-
364
- impl TryFrom < & FieldValue > for u64 {
365
- type Error = FieldValueError ;
366
-
367
- fn try_from ( value : & FieldValue ) -> Result < Self , Self :: Error > {
368
- match value {
369
- FieldValue :: DataNumber ( d) => {
370
- let d: u64 = d. try_into ( ) . map_err ( |_| FieldValueError :: InvalidDataType ) ?;
371
- Ok ( d)
372
- }
373
- _ => Err ( FieldValueError :: InvalidDataType ) ,
374
- }
375
- }
376
- }
377
-
378
- impl TryFrom < & FieldValue > for u128 {
379
- type Error = FieldValueError ;
380
-
381
- fn try_from ( value : & FieldValue ) -> Result < Self , Self :: Error > {
382
- match value {
383
- FieldValue :: DataNumber ( d) => {
384
- let d: u128 = d. try_into ( ) . map_err ( |_| FieldValueError :: InvalidDataType ) ?;
385
- Ok ( d)
386
- }
387
- _ => Err ( FieldValueError :: InvalidDataType ) ,
388
- }
389
- }
390
- }
391
-
392
297
impl FieldValue {
393
298
pub fn to_be_bytes ( & self ) -> Vec < u8 > {
394
299
match self {
@@ -427,7 +332,6 @@ mod data_number_tests {
427
332
fn it_tests_3_byte_data_number_exports ( ) {
428
333
use super :: DataNumber ;
429
334
let data = DataNumber :: parse ( & [ 1 , 246 , 118 ] , 3 , false ) . unwrap ( ) . 1 ;
430
- println ! ( "{:?}" , data) ;
431
335
assert_eq ! ( data. to_be_bytes( ) , vec![ 1 , 246 , 118 ] ) ;
432
336
}
433
337
}
0 commit comments