1313//!
1414//! [1]: https://github.com/P-H-C/phc-string-format/blob/master/phc-sf-spec.md
1515
16+ use crate :: errors:: InvalidValue ;
1617use crate :: { Encoding , Error , Result } ;
1718use core:: { convert:: TryFrom , fmt, str} ;
1819
@@ -50,7 +51,7 @@ impl<'a> Value<'a> {
5051 /// the PHC string format's rules.
5152 pub fn new ( input : & ' a str ) -> Result < Self > {
5253 if input. as_bytes ( ) . len ( ) > Self :: MAX_LENGTH {
53- return Err ( Error :: ParamValueInvalid ) ;
54+ return Err ( Error :: ParamValueInvalid ( InvalidValue :: ToLong ) ) ;
5455 }
5556
5657 // Check that the characters are permitted in a PHC parameter value.
@@ -124,26 +125,26 @@ impl<'a> Value<'a> {
124125
125126 // Empty strings aren't decimals
126127 if value. is_empty ( ) {
127- return Err ( Error :: ParamValueInvalid ) ;
128+ return Err ( Error :: ParamValueInvalid ( InvalidValue :: NotProvided ) ) ;
128129 }
129130
130131 // Ensure all characters are digits
131132 for c in value. chars ( ) {
132133 if !matches ! ( c, '0' ..='9' ) {
133- return Err ( Error :: ParamValueInvalid ) ;
134+ return Err ( Error :: ParamValueInvalid ( InvalidValue :: InvalidChar ) ) ;
134135 }
135136 }
136137
137138 // Disallow leading zeroes
138139 if value. starts_with ( '0' ) && value. len ( ) > 1 {
139- return Err ( Error :: ParamValueInvalid ) ;
140+ return Err ( Error :: ParamValueInvalid ( InvalidValue :: InvalidFormat ) ) ;
140141 }
141142
142143 value. parse ( ) . map_err ( |_| {
143144 // In theory a value overflow should be the only potential error here.
144145 // When `ParseIntError::kind` is stable it might be good to double check:
145146 // <https://github.com/rust-lang/rust/issues/22639>
146- Error :: ParamValueInvalid
147+ Error :: ParamValueInvalid ( InvalidValue :: InvalidFormat )
147148 } )
148149 }
149150
@@ -193,7 +194,7 @@ impl<'a> fmt::Display for Value<'a> {
193194fn assert_valid_value ( input : & str ) -> Result < ( ) > {
194195 for c in input. chars ( ) {
195196 if !is_char_valid ( c) {
196- return Err ( Error :: ParamValueInvalid ) ;
197+ return Err ( Error :: ParamValueInvalid ( InvalidValue :: InvalidChar ) ) ;
197198 }
198199 }
199200
@@ -207,7 +208,7 @@ fn is_char_valid(c: char) -> bool {
207208
208209#[ cfg( test) ]
209210mod tests {
210- use super :: { Error , Value } ;
211+ use super :: { Error , InvalidValue , Value } ;
211212 use core:: convert:: TryFrom ;
212213
213214 // Invalid value examples
@@ -236,21 +237,27 @@ mod tests {
236237 fn reject_decimal_with_leading_zero ( ) {
237238 let value = Value :: new ( "01" ) . unwrap ( ) ;
238239 let err = u32:: try_from ( value) . err ( ) . unwrap ( ) ;
239- assert ! ( matches!( err, Error :: ParamValueInvalid ) ) ;
240+ assert ! ( matches!(
241+ err,
242+ Error :: ParamValueInvalid ( InvalidValue :: InvalidFormat )
243+ ) ) ;
240244 }
241245
242246 #[ test]
243247 fn reject_overlong_decimal ( ) {
244248 let value = Value :: new ( "4294967296" ) . unwrap ( ) ;
245249 let err = u32:: try_from ( value) . err ( ) . unwrap ( ) ;
246- assert_eq ! ( err, Error :: ParamValueInvalid ) ;
250+ assert_eq ! ( err, Error :: ParamValueInvalid ( InvalidValue :: InvalidFormat ) ) ;
247251 }
248252
249253 #[ test]
250254 fn reject_negative ( ) {
251255 let value = Value :: new ( "-1" ) . unwrap ( ) ;
252256 let err = u32:: try_from ( value) . err ( ) . unwrap ( ) ;
253- assert ! ( matches!( err, Error :: ParamValueInvalid ) ) ;
257+ assert ! ( matches!(
258+ err,
259+ Error :: ParamValueInvalid ( InvalidValue :: InvalidChar )
260+ ) ) ;
254261 }
255262
256263 //
@@ -278,18 +285,21 @@ mod tests {
278285 #[ test]
279286 fn reject_invalid_char ( ) {
280287 let err = Value :: new ( INVALID_CHAR ) . err ( ) . unwrap ( ) ;
281- assert ! ( matches!( err, Error :: ParamValueInvalid ) ) ;
288+ assert ! ( matches!(
289+ err,
290+ Error :: ParamValueInvalid ( InvalidValue :: InvalidChar )
291+ ) ) ;
282292 }
283293
284294 #[ test]
285295 fn reject_too_long ( ) {
286296 let err = Value :: new ( INVALID_TOO_LONG ) . err ( ) . unwrap ( ) ;
287- assert_eq ! ( err, Error :: ParamValueInvalid ) ;
297+ assert_eq ! ( err, Error :: ParamValueInvalid ( InvalidValue :: ToLong ) ) ;
288298 }
289299
290300 #[ test]
291301 fn reject_invalid_char_and_too_long ( ) {
292302 let err = Value :: new ( INVALID_CHAR_AND_TOO_LONG ) . err ( ) . unwrap ( ) ;
293- assert_eq ! ( err, Error :: ParamValueInvalid ) ;
303+ assert_eq ! ( err, Error :: ParamValueInvalid ( InvalidValue :: ToLong ) ) ;
294304 }
295305}
0 commit comments