@@ -165,23 +165,24 @@ impl ExtendedParser for u64 {
165165 ExtendedBigDecimal :: BigDecimal ( bd) => {
166166 let ( digits, scale) = bd. into_bigint_and_scale ( ) ;
167167 if scale == 0 {
168- let negative = digits. sign ( ) == Sign :: Minus ;
168+ let ( sign, digits) = digits. into_parts ( ) ;
169+
169170 match u64:: try_from ( digits) {
170- Ok ( i) => Ok ( i) ,
171- _ => Err ( ExtendedParserError :: Overflow ( if negative {
172- // TODO: We should wrap around here #7488
173- 0
174- } else {
175- u64:: MAX
176- } ) ) ,
171+ Ok ( i) => {
172+ if sign == Sign :: Minus {
173+ Ok ( !i + 1 )
174+ } else {
175+ Ok ( i)
176+ }
177+ }
178+ _ => Err ( ExtendedParserError :: Overflow ( u64:: MAX ) ) ,
177179 }
178180 } else {
179181 // Should not happen.
180182 Err ( ExtendedParserError :: NotNumeric )
181183 }
182184 }
183- // TODO: Handle -0 too #7488
184- // No other case should not happen.
185+ ExtendedBigDecimal :: MinusZero => Ok ( 0 ) ,
185186 _ => Err ( ExtendedParserError :: NotNumeric ) ,
186187 }
187188 }
@@ -527,10 +528,28 @@ mod tests {
527528 fn test_decimal_u64 ( ) {
528529 assert_eq ! ( Ok ( 123 ) , u64 :: extended_parse( "123" ) ) ;
529530 assert_eq ! ( Ok ( u64 :: MAX ) , u64 :: extended_parse( & format!( "{}" , u64 :: MAX ) ) ) ;
530- // TODO: We should wrap around here #7488
531+ assert_eq ! ( Ok ( 0 ) , u64 :: extended_parse( "-0" ) ) ;
532+ assert_eq ! ( Ok ( u64 :: MAX ) , u64 :: extended_parse( "-1" ) ) ;
533+ assert_eq ! (
534+ Ok ( u64 :: MAX / 2 + 1 ) ,
535+ u64 :: extended_parse( "-9223372036854775808" ) // i64::MIN
536+ ) ;
537+ assert_eq ! (
538+ Ok ( 1123372036854675616 ) ,
539+ u64 :: extended_parse( "-17323372036854876000" ) // 2*i64::MIN
540+ ) ;
541+ assert_eq ! ( Ok ( 1 ) , u64 :: extended_parse( "-18446744073709551615" ) ) ; // -u64::MAX
542+ assert ! ( matches!(
543+ u64 :: extended_parse( "-18446744073709551616" ) , // -u64::MAX - 1
544+ Err ( ExtendedParserError :: Overflow ( u64 :: MAX ) )
545+ ) ) ;
546+ assert ! ( matches!(
547+ u64 :: extended_parse( "-92233720368547758150" ) ,
548+ Err ( ExtendedParserError :: Overflow ( u64 :: MAX ) )
549+ ) ) ;
531550 assert ! ( matches!(
532- u64 :: extended_parse( "-123 " ) ,
533- Err ( ExtendedParserError :: Overflow ( 0 ) )
551+ u64 :: extended_parse( "-170141183460469231731687303715884105729 " ) ,
552+ Err ( ExtendedParserError :: Overflow ( u64 :: MAX ) )
534553 ) ) ;
535554 assert ! ( matches!(
536555 u64 :: extended_parse( "" ) ,
0 commit comments