@@ -5,14 +5,15 @@ use std::{
5
5
net:: { IpAddr , Ipv4Addr , Ipv6Addr } ,
6
6
} ;
7
7
8
- use anyhow:: Context ;
9
8
use byteorder:: { BigEndian , ByteOrder , NativeEndian } ;
10
9
11
10
use crate :: DecodeError ;
12
11
13
12
pub fn parse_mac ( payload : & [ u8 ] ) -> Result < [ u8 ; 6 ] , DecodeError > {
14
13
if payload. len ( ) != 6 {
15
- return Err ( format ! ( "invalid MAC address: {payload:?}" ) . into ( ) ) ;
14
+ return Err ( DecodeError :: InvalidMACAddress {
15
+ received : payload. len ( ) ,
16
+ } ) ;
16
17
}
17
18
let mut address: [ u8 ; 6 ] = [ 0 ; 6 ] ;
18
19
for ( i, byte) in payload. iter ( ) . enumerate ( ) {
@@ -23,7 +24,9 @@ pub fn parse_mac(payload: &[u8]) -> Result<[u8; 6], DecodeError> {
23
24
24
25
pub fn parse_ipv6 ( payload : & [ u8 ] ) -> Result < [ u8 ; 16 ] , DecodeError > {
25
26
if payload. len ( ) != 16 {
26
- return Err ( format ! ( "invalid IPv6 address: {payload:?}" ) . into ( ) ) ;
27
+ return Err ( DecodeError :: InvalidIPAddress {
28
+ received : payload. len ( ) ,
29
+ } ) ;
27
30
}
28
31
let mut address: [ u8 ; 16 ] = [ 0 ; 16 ] ;
29
32
for ( i, byte) in payload. iter ( ) . enumerate ( ) {
@@ -57,7 +60,7 @@ pub fn parse_ip(payload: &[u8]) -> Result<IpAddr, DecodeError> {
57
60
payload[ 15 ] ,
58
61
] )
59
62
. into ( ) ) ,
60
- _ => Err ( format ! ( "invalid IPv6 address: {payload:?}" ) . into ( ) ) ,
63
+ other => Err ( DecodeError :: InvalidIPAddress { received : other } ) ,
61
64
}
62
65
}
63
66
@@ -71,62 +74,86 @@ pub fn parse_string(payload: &[u8]) -> Result<String, DecodeError> {
71
74
} else {
72
75
& payload[ ..payload. len ( ) ]
73
76
} ;
74
- let s = String :: from_utf8 ( slice. to_vec ( ) ) . context ( "invalid string" ) ?;
77
+ let s = String :: from_utf8 ( slice. to_vec ( ) ) ?;
75
78
Ok ( s)
76
79
}
77
80
78
81
pub fn parse_u8 ( payload : & [ u8 ] ) -> Result < u8 , DecodeError > {
79
82
if payload. len ( ) != 1 {
80
- return Err ( format ! ( "invalid u8: {payload:?}" ) . into ( ) ) ;
83
+ return Err ( DecodeError :: InvalidNumber {
84
+ expected : 1 ,
85
+ received : payload. len ( ) ,
86
+ } ) ;
81
87
}
82
88
Ok ( payload[ 0 ] )
83
89
}
84
90
85
91
pub fn parse_u32 ( payload : & [ u8 ] ) -> Result < u32 , DecodeError > {
86
92
if payload. len ( ) != size_of :: < u32 > ( ) {
87
- return Err ( format ! ( "invalid u32: {payload:?}" ) . into ( ) ) ;
93
+ return Err ( DecodeError :: InvalidNumber {
94
+ expected : size_of :: < u32 > ( ) ,
95
+ received : payload. len ( ) ,
96
+ } ) ;
88
97
}
89
98
Ok ( NativeEndian :: read_u32 ( payload) )
90
99
}
91
100
92
101
pub fn parse_u64 ( payload : & [ u8 ] ) -> Result < u64 , DecodeError > {
93
102
if payload. len ( ) != size_of :: < u64 > ( ) {
94
- return Err ( format ! ( "invalid u64: {payload:?}" ) . into ( ) ) ;
103
+ return Err ( DecodeError :: InvalidNumber {
104
+ expected : size_of :: < u64 > ( ) ,
105
+ received : payload. len ( ) ,
106
+ } ) ;
95
107
}
96
108
Ok ( NativeEndian :: read_u64 ( payload) )
97
109
}
98
110
99
111
pub fn parse_u128 ( payload : & [ u8 ] ) -> Result < u128 , DecodeError > {
100
112
if payload. len ( ) != size_of :: < u128 > ( ) {
101
- return Err ( format ! ( "invalid u128: {payload:?}" ) . into ( ) ) ;
113
+ return Err ( DecodeError :: InvalidNumber {
114
+ expected : size_of :: < u128 > ( ) ,
115
+ received : payload. len ( ) ,
116
+ } ) ;
102
117
}
103
118
Ok ( NativeEndian :: read_u128 ( payload) )
104
119
}
105
120
106
121
pub fn parse_u16 ( payload : & [ u8 ] ) -> Result < u16 , DecodeError > {
107
122
if payload. len ( ) != size_of :: < u16 > ( ) {
108
- return Err ( format ! ( "invalid u16: {payload:?}" ) . into ( ) ) ;
123
+ return Err ( DecodeError :: InvalidNumber {
124
+ expected : size_of :: < u16 > ( ) ,
125
+ received : payload. len ( ) ,
126
+ } ) ;
109
127
}
110
128
Ok ( NativeEndian :: read_u16 ( payload) )
111
129
}
112
130
113
131
pub fn parse_i32 ( payload : & [ u8 ] ) -> Result < i32 , DecodeError > {
114
132
if payload. len ( ) != 4 {
115
- return Err ( format ! ( "invalid u32: {payload:?}" ) . into ( ) ) ;
133
+ return Err ( DecodeError :: InvalidNumber {
134
+ expected : 4 ,
135
+ received : payload. len ( ) ,
136
+ } ) ;
116
137
}
117
138
Ok ( NativeEndian :: read_i32 ( payload) )
118
139
}
119
140
120
141
pub fn parse_u16_be ( payload : & [ u8 ] ) -> Result < u16 , DecodeError > {
121
142
if payload. len ( ) != size_of :: < u16 > ( ) {
122
- return Err ( format ! ( "invalid u16: {payload:?}" ) . into ( ) ) ;
143
+ return Err ( DecodeError :: InvalidNumber {
144
+ expected : size_of :: < u16 > ( ) ,
145
+ received : payload. len ( ) ,
146
+ } ) ;
123
147
}
124
148
Ok ( BigEndian :: read_u16 ( payload) )
125
149
}
126
150
127
151
pub fn parse_u32_be ( payload : & [ u8 ] ) -> Result < u32 , DecodeError > {
128
152
if payload. len ( ) != size_of :: < u32 > ( ) {
129
- return Err ( format ! ( "invalid u32: {payload:?}" ) . into ( ) ) ;
153
+ return Err ( DecodeError :: InvalidNumber {
154
+ expected : size_of :: < u32 > ( ) ,
155
+ received : payload. len ( ) ,
156
+ } ) ;
130
157
}
131
158
Ok ( BigEndian :: read_u32 ( payload) )
132
159
}
0 commit comments