@@ -5,14 +5,15 @@ use std::{
55 net:: { IpAddr , Ipv4Addr , Ipv6Addr } ,
66} ;
77
8- use anyhow:: Context ;
98use byteorder:: { BigEndian , ByteOrder , NativeEndian } ;
109
1110use crate :: DecodeError ;
1211
1312pub fn parse_mac ( payload : & [ u8 ] ) -> Result < [ u8 ; 6 ] , DecodeError > {
1413 if payload. len ( ) != 6 {
15- return Err ( format ! ( "invalid MAC address: {payload:?}" ) . into ( ) ) ;
14+ return Err ( DecodeError :: InvalidMACAddress {
15+ received : payload. len ( ) ,
16+ } ) ;
1617 }
1718 let mut address: [ u8 ; 6 ] = [ 0 ; 6 ] ;
1819 for ( i, byte) in payload. iter ( ) . enumerate ( ) {
@@ -23,7 +24,9 @@ pub fn parse_mac(payload: &[u8]) -> Result<[u8; 6], DecodeError> {
2324
2425pub fn parse_ipv6 ( payload : & [ u8 ] ) -> Result < [ u8 ; 16 ] , DecodeError > {
2526 if payload. len ( ) != 16 {
26- return Err ( format ! ( "invalid IPv6 address: {payload:?}" ) . into ( ) ) ;
27+ return Err ( DecodeError :: InvalidIPAddress {
28+ received : payload. len ( ) ,
29+ } ) ;
2730 }
2831 let mut address: [ u8 ; 16 ] = [ 0 ; 16 ] ;
2932 for ( i, byte) in payload. iter ( ) . enumerate ( ) {
@@ -57,7 +60,7 @@ pub fn parse_ip(payload: &[u8]) -> Result<IpAddr, DecodeError> {
5760 payload[ 15 ] ,
5861 ] )
5962 . into ( ) ) ,
60- _ => Err ( format ! ( "invalid IPv6 address: {payload:?}" ) . into ( ) ) ,
63+ other => Err ( DecodeError :: InvalidIPAddress { received : other } ) ,
6164 }
6265}
6366
@@ -71,62 +74,86 @@ pub fn parse_string(payload: &[u8]) -> Result<String, DecodeError> {
7174 } else {
7275 & payload[ ..payload. len ( ) ]
7376 } ;
74- let s = String :: from_utf8 ( slice. to_vec ( ) ) . context ( "invalid string" ) ?;
77+ let s = String :: from_utf8 ( slice. to_vec ( ) ) ?;
7578 Ok ( s)
7679}
7780
7881pub fn parse_u8 ( payload : & [ u8 ] ) -> Result < u8 , DecodeError > {
7982 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+ } ) ;
8187 }
8288 Ok ( payload[ 0 ] )
8389}
8490
8591pub fn parse_u32 ( payload : & [ u8 ] ) -> Result < u32 , DecodeError > {
8692 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+ } ) ;
8897 }
8998 Ok ( NativeEndian :: read_u32 ( payload) )
9099}
91100
92101pub fn parse_u64 ( payload : & [ u8 ] ) -> Result < u64 , DecodeError > {
93102 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+ } ) ;
95107 }
96108 Ok ( NativeEndian :: read_u64 ( payload) )
97109}
98110
99111pub fn parse_u128 ( payload : & [ u8 ] ) -> Result < u128 , DecodeError > {
100112 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+ } ) ;
102117 }
103118 Ok ( NativeEndian :: read_u128 ( payload) )
104119}
105120
106121pub fn parse_u16 ( payload : & [ u8 ] ) -> Result < u16 , DecodeError > {
107122 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+ } ) ;
109127 }
110128 Ok ( NativeEndian :: read_u16 ( payload) )
111129}
112130
113131pub fn parse_i32 ( payload : & [ u8 ] ) -> Result < i32 , DecodeError > {
114132 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+ } ) ;
116137 }
117138 Ok ( NativeEndian :: read_i32 ( payload) )
118139}
119140
120141pub fn parse_u16_be ( payload : & [ u8 ] ) -> Result < u16 , DecodeError > {
121142 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+ } ) ;
123147 }
124148 Ok ( BigEndian :: read_u16 ( payload) )
125149}
126150
127151pub fn parse_u32_be ( payload : & [ u8 ] ) -> Result < u32 , DecodeError > {
128152 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+ } ) ;
130157 }
131158 Ok ( BigEndian :: read_u32 ( payload) )
132159}
0 commit comments