@@ -109,14 +109,14 @@ fn parse_rfc2822<'a>(parsed: &mut Parsed, mut s: &'a str) -> ParseResult<(&'a st
109109 }
110110
111111 s = s. trim_start ( ) ;
112- parsed. set_day ( try_consume ! ( scan:: number( s, 1 , 2 ) ) ) ?;
112+ parsed. set_day ( try_consume ! ( scan:: number( s, 1 , 2 , true ) ) ) ?;
113113 s = scan:: space ( s) ?; // mandatory
114114 parsed. set_month ( 1 + i64:: from ( try_consume ! ( scan:: short_month0( s) ) ) ) ?;
115115 s = scan:: space ( s) ?; // mandatory
116116
117117 // distinguish two- and three-digit years from four-digit years
118118 let prevlen = s. len ( ) ;
119- let mut year = try_consume ! ( scan:: number( s, 2 , usize :: MAX ) ) ;
119+ let mut year = try_consume ! ( scan:: number( s, 2 , usize :: MAX , true ) ) ;
120120 let yearlen = prevlen - s. len ( ) ;
121121 match ( yearlen, year) {
122122 ( 2 , 0 ..=49 ) => {
@@ -133,12 +133,12 @@ fn parse_rfc2822<'a>(parsed: &mut Parsed, mut s: &'a str) -> ParseResult<(&'a st
133133 parsed. set_year ( year) ?;
134134
135135 s = scan:: space ( s) ?; // mandatory
136- parsed. set_hour ( try_consume ! ( scan:: number( s, 2 , 2 ) ) ) ?;
136+ parsed. set_hour ( try_consume ! ( scan:: number( s, 2 , 2 , true ) ) ) ?;
137137 s = scan:: char ( s. trim_start ( ) , b':' ) ?. trim_start ( ) ; // *S ":" *S
138- parsed. set_minute ( try_consume ! ( scan:: number( s, 2 , 2 ) ) ) ?;
138+ parsed. set_minute ( try_consume ! ( scan:: number( s, 2 , 2 , true ) ) ) ?;
139139 if let Ok ( s_) = scan:: char ( s. trim_start ( ) , b':' ) {
140140 // [ ":" *S 2DIGIT ]
141- parsed. set_second ( try_consume ! ( scan:: number( s_, 2 , 2 ) ) ) ?;
141+ parsed. set_second ( try_consume ! ( scan:: number( s_, 2 , 2 , true ) ) ) ?;
142142 }
143143
144144 s = scan:: space ( s) ?; // mandatory
@@ -190,23 +190,23 @@ pub(crate) fn parse_rfc3339<'a>(parsed: &mut Parsed, mut s: &'a str) -> ParseRes
190190 //
191191 // - For readability a full-date and a full-time may be separated by a space character.
192192
193- parsed. set_year ( try_consume ! ( scan:: number( s, 4 , 4 ) ) ) ?;
193+ parsed. set_year ( try_consume ! ( scan:: number( s, 4 , 4 , true ) ) ) ?;
194194 s = scan:: char ( s, b'-' ) ?;
195- parsed. set_month ( try_consume ! ( scan:: number( s, 2 , 2 ) ) ) ?;
195+ parsed. set_month ( try_consume ! ( scan:: number( s, 2 , 2 , true ) ) ) ?;
196196 s = scan:: char ( s, b'-' ) ?;
197- parsed. set_day ( try_consume ! ( scan:: number( s, 2 , 2 ) ) ) ?;
197+ parsed. set_day ( try_consume ! ( scan:: number( s, 2 , 2 , true ) ) ) ?;
198198
199199 s = match s. as_bytes ( ) . first ( ) {
200200 Some ( & b't' | & b'T' | & b' ' ) => & s[ 1 ..] ,
201201 Some ( _) => return Err ( INVALID ) ,
202202 None => return Err ( TOO_SHORT ) ,
203203 } ;
204204
205- parsed. set_hour ( try_consume ! ( scan:: number( s, 2 , 2 ) ) ) ?;
205+ parsed. set_hour ( try_consume ! ( scan:: number( s, 2 , 2 , true ) ) ) ?;
206206 s = scan:: char ( s, b':' ) ?;
207- parsed. set_minute ( try_consume ! ( scan:: number( s, 2 , 2 ) ) ) ?;
207+ parsed. set_minute ( try_consume ! ( scan:: number( s, 2 , 2 , true ) ) ) ?;
208208 s = scan:: char ( s, b':' ) ?;
209- parsed. set_second ( try_consume ! ( scan:: number( s, 2 , 2 ) ) ) ?;
209+ parsed. set_second ( try_consume ! ( scan:: number( s, 2 , 2 , true ) ) ) ?;
210210 if s. starts_with ( '.' ) {
211211 let nanosecond = try_consume ! ( scan:: nanosecond( & s[ 1 ..] ) ) ;
212212 parsed. set_nanosecond ( nanosecond) ?;
@@ -357,7 +357,7 @@ where
357357 Minute => ( 2 , false , Parsed :: set_minute) ,
358358 Second => ( 2 , false , Parsed :: set_second) ,
359359 Nanosecond => ( 9 , false , Parsed :: set_nanosecond) ,
360- Timestamp => ( usize:: MAX , false , Parsed :: set_timestamp) ,
360+ Timestamp => ( usize:: MAX , true , Parsed :: set_timestamp) ,
361361
362362 // for the future expansion
363363 Internal ( ref int) => match int. _dummy { } ,
@@ -366,16 +366,15 @@ where
366366 s = s. trim_start ( ) ;
367367 let v = if signed {
368368 if s. starts_with ( '-' ) {
369- let v = try_consume ! ( scan:: number( & s[ 1 ..] , 1 , usize :: MAX ) ) ;
370- 0i64 . checked_sub ( v) . ok_or ( OUT_OF_RANGE ) ?
369+ try_consume ! ( scan:: number( & s[ 1 ..] , 1 , usize :: MAX , false ) )
371370 } else if s. starts_with ( '+' ) {
372- try_consume ! ( scan:: number( & s[ 1 ..] , 1 , usize :: MAX ) )
371+ try_consume ! ( scan:: number( & s[ 1 ..] , 1 , usize :: MAX , true ) )
373372 } else {
374373 // if there is no explicit sign, we respect the original `width`
375- try_consume ! ( scan:: number( s, 1 , width) )
374+ try_consume ! ( scan:: number( s, 1 , width, true ) )
376375 }
377376 } else {
378- try_consume ! ( scan:: number( s, 1 , width) )
377+ try_consume ! ( scan:: number( s, 1 , width, true ) )
379378 } ;
380379 set ( parsed, v) ?;
381380 }
@@ -765,6 +764,7 @@ mod tests {
765764 check ( " + 42" , & [ Space ( " " ) , num ( Year ) ] , Err ( INVALID ) ) ;
766765 check ( "-" , & [ num ( Year ) ] , Err ( TOO_SHORT ) ) ;
767766 check ( "+" , & [ num ( Year ) ] , Err ( TOO_SHORT ) ) ;
767+ check ( "-9223372036854775808" , & [ num ( Timestamp ) ] , parsed ! ( timestamp: i64 :: MIN ) ) ;
768768
769769 // unsigned numeric
770770 check ( "345" , & [ num ( Ordinal ) ] , parsed ! ( ordinal: 345 ) ) ;
0 commit comments