1
- use std:: convert:: TryFrom ;
1
+ use std:: { borrow :: Cow , convert:: TryFrom } ;
2
2
3
3
pub trait Tlv : Sized {
4
4
const TYPE : u8 ;
5
5
6
- fn try_from_parts ( typ : u8 , value : & [ u8 ] ) -> Option < Self > ;
6
+ fn try_from_value ( value : & [ u8 ] ) -> Option < Self > ;
7
7
8
- fn value_bytes ( & self ) -> Vec < u8 > ;
8
+ fn value_bytes ( & self ) -> Cow < ' _ , [ u8 ] > ;
9
+
10
+ fn try_from_parts ( typ : u8 , value : & [ u8 ] ) -> Option < Self > {
11
+ if typ != Self :: TYPE {
12
+ return None ;
13
+ }
14
+
15
+ Self :: try_from_value ( value)
16
+ }
9
17
}
10
18
11
19
#[ derive( Debug , Clone , Default , PartialEq , Eq ) ]
@@ -16,20 +24,82 @@ pub struct Crc32c {
16
24
impl Tlv for Crc32c {
17
25
const TYPE : u8 = 0x03 ;
18
26
19
- fn try_from_parts ( typ : u8 , value : & [ u8 ] ) -> Option < Self > {
20
- if typ != Self :: TYPE {
21
- return None ;
22
- }
23
-
27
+ fn try_from_value ( value : & [ u8 ] ) -> Option < Self > {
24
28
let checksum_bytes = <[ u8 ; 4 ] >:: try_from ( value) . ok ( ) ?;
25
29
26
30
Some ( Self {
27
31
checksum : u32:: from_be_bytes ( checksum_bytes) ,
28
32
} )
29
33
}
30
34
31
- fn value_bytes ( & self ) -> Vec < u8 > {
32
- self . checksum . to_be_bytes ( ) . to_vec ( )
35
+ fn value_bytes ( & self ) -> Cow < ' _ , [ u8 ] > {
36
+ Cow :: Owned ( self . checksum . to_be_bytes ( ) . to_vec ( ) )
37
+ }
38
+ }
39
+
40
+ #[ derive( Debug , Clone , Default , PartialEq , Eq ) ]
41
+ pub struct Noop {
42
+ value : Vec < u8 > ,
43
+ }
44
+
45
+ impl Noop {
46
+ ///
47
+ ///
48
+ /// # Panics
49
+ /// Panics if value is empty (i.e., has length of 0).
50
+ pub fn new ( value : impl Into < Vec < u8 > > ) -> Self {
51
+ let value = value. into ( ) ;
52
+
53
+ assert ! ( !value. is_empty( ) , "Noop TLV `value` cannot be empty" ) ;
54
+
55
+ Self { value }
56
+ }
57
+ }
58
+
59
+ impl Tlv for Noop {
60
+ const TYPE : u8 = 0x04 ;
61
+
62
+ fn try_from_value ( value : & [ u8 ] ) -> Option < Self > {
63
+ Some ( Self {
64
+ value : value. to_owned ( ) ,
65
+ } )
66
+ }
67
+
68
+ fn value_bytes ( & self ) -> Cow < ' _ , [ u8 ] > {
69
+ Cow :: Borrowed ( & self . value )
70
+ }
71
+ }
72
+
73
+ #[ derive( Debug , Clone , Default , PartialEq , Eq ) ]
74
+ pub struct UniqueId {
75
+ value : Vec < u8 > ,
76
+ }
77
+
78
+ impl UniqueId {
79
+ ///
80
+ ///
81
+ /// # Panics
82
+ /// Panics if value is empty (i.e., has length of 0).
83
+ pub fn new ( value : impl Into < Vec < u8 > > ) -> Self {
84
+ let value = value. into ( ) ;
85
+
86
+ assert ! ( !value. is_empty( ) , "UniqueId TLV `value` cannot be empty" ) ;
87
+
88
+ Self { value }
89
+ }
90
+ }
91
+
92
+ impl Tlv for UniqueId {
93
+ const TYPE : u8 = 0x05 ;
94
+
95
+ fn try_from_value ( value : & [ u8 ] ) -> Option < Self > {
96
+ Some ( Self {
97
+ value : value. to_owned ( ) ,
98
+ } )
99
+ }
100
+
101
+ fn value_bytes ( & self ) -> Cow < ' _ , [ u8 ] > {
102
+ Cow :: Borrowed ( & self . value )
33
103
}
34
104
}
35
105
0 commit comments