@@ -109,14 +109,14 @@ fn parse_rfc2822<'a>(parsed: &mut Parsed, mut s: &'a str) -> ParseResult<(&'a st
109
109
}
110
110
111
111
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 ) ) ) ?;
113
113
s = scan:: space ( s) ?; // mandatory
114
114
parsed. set_month ( 1 + i64:: from ( try_consume ! ( scan:: short_month0( s) ) ) ) ?;
115
115
s = scan:: space ( s) ?; // mandatory
116
116
117
117
// distinguish two- and three-digit years from four-digit years
118
118
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 ) ) ;
120
120
let yearlen = prevlen - s. len ( ) ;
121
121
match ( yearlen, year) {
122
122
( 2 , 0 ..=49 ) => {
@@ -133,12 +133,12 @@ fn parse_rfc2822<'a>(parsed: &mut Parsed, mut s: &'a str) -> ParseResult<(&'a st
133
133
parsed. set_year ( year) ?;
134
134
135
135
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 ) ) ) ?;
137
137
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 ) ) ) ?;
139
139
if let Ok ( s_) = scan:: char ( s. trim_start ( ) , b':' ) {
140
140
// [ ":" *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 ) ) ) ?;
142
142
}
143
143
144
144
s = scan:: space ( s) ?; // mandatory
@@ -190,23 +190,23 @@ pub(crate) fn parse_rfc3339<'a>(parsed: &mut Parsed, mut s: &'a str) -> ParseRes
190
190
//
191
191
// - For readability a full-date and a full-time may be separated by a space character.
192
192
193
- parsed. set_year ( try_consume ! ( scan:: number( s, 4 , 4 ) ) ) ?;
193
+ parsed. set_year ( try_consume ! ( scan:: number( s, 4 , 4 , true ) ) ) ?;
194
194
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 ) ) ) ?;
196
196
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 ) ) ) ?;
198
198
199
199
s = match s. as_bytes ( ) . first ( ) {
200
200
Some ( & b't' | & b'T' | & b' ' ) => & s[ 1 ..] ,
201
201
Some ( _) => return Err ( INVALID ) ,
202
202
None => return Err ( TOO_SHORT ) ,
203
203
} ;
204
204
205
- parsed. set_hour ( try_consume ! ( scan:: number( s, 2 , 2 ) ) ) ?;
205
+ parsed. set_hour ( try_consume ! ( scan:: number( s, 2 , 2 , true ) ) ) ?;
206
206
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 ) ) ) ?;
208
208
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 ) ) ) ?;
210
210
if s. starts_with ( '.' ) {
211
211
let nanosecond = try_consume ! ( scan:: nanosecond( & s[ 1 ..] ) ) ;
212
212
parsed. set_nanosecond ( nanosecond) ?;
@@ -357,7 +357,7 @@ where
357
357
Minute => ( 2 , false , Parsed :: set_minute) ,
358
358
Second => ( 2 , false , Parsed :: set_second) ,
359
359
Nanosecond => ( 9 , false , Parsed :: set_nanosecond) ,
360
- Timestamp => ( usize:: MAX , false , Parsed :: set_timestamp) ,
360
+ Timestamp => ( usize:: MAX , true , Parsed :: set_timestamp) ,
361
361
362
362
// for the future expansion
363
363
Internal ( ref int) => match int. _dummy { } ,
@@ -366,16 +366,15 @@ where
366
366
s = s. trim_start ( ) ;
367
367
let v = if signed {
368
368
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 ) )
371
370
} 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 ) )
373
372
} else {
374
373
// 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 ) )
376
375
}
377
376
} else {
378
- try_consume ! ( scan:: number( s, 1 , width) )
377
+ try_consume ! ( scan:: number( s, 1 , width, true ) )
379
378
} ;
380
379
set ( parsed, v) ?;
381
380
}
@@ -765,6 +764,7 @@ mod tests {
765
764
check ( " + 42" , & [ Space ( " " ) , num ( Year ) ] , Err ( INVALID ) ) ;
766
765
check ( "-" , & [ num ( Year ) ] , Err ( TOO_SHORT ) ) ;
767
766
check ( "+" , & [ num ( Year ) ] , Err ( TOO_SHORT ) ) ;
767
+ check ( "-9223372036854775808" , & [ num ( Timestamp ) ] , parsed ! ( timestamp: i64 :: MIN ) ) ;
768
768
769
769
// unsigned numeric
770
770
check ( "345" , & [ num ( Ordinal ) ] , parsed ! ( ordinal: 345 ) ) ;
0 commit comments