@@ -277,6 +277,26 @@ macro_rules! deserialize_signed {
277
277
} } ;
278
278
}
279
279
280
+ macro_rules! deserialize_fromstr {
281
+ ( $self: ident, $visitor: ident, $typ: ident, $visit_fn: ident, $pattern: expr) => { {
282
+ let start = $self. index;
283
+ loop {
284
+ match $self. peek( ) {
285
+ Some ( c) => {
286
+ if $pattern. iter( ) . find( |&&d| d == c) . is_some( ) {
287
+ $self. eat_char( ) ;
288
+ } else {
289
+ let s = str :: from_utf8( & $self. slice[ start..$self. index] ) . unwrap( ) ;
290
+ let v = $typ:: from_str( s) . or( Err ( Error :: InvalidNumber ) ) ?;
291
+ return $visitor. $visit_fn( v) ;
292
+ }
293
+ } ,
294
+ None => return Err ( Error :: EofWhileParsingNumber ) ,
295
+ }
296
+ }
297
+ } } ;
298
+ }
299
+
280
300
impl < ' a , ' de > de:: Deserializer < ' de > for & ' a mut Deserializer < ' de > {
281
301
type Error = Error ;
282
302
@@ -369,29 +389,15 @@ impl<'a, 'de> de::Deserializer<'de> for &'a mut Deserializer<'de> {
369
389
V : Visitor < ' de > ,
370
390
{
371
391
self . parse_whitespace ( ) . ok_or ( Error :: EofWhileParsingValue ) ?;
372
- let start = self . index ;
373
- loop {
374
- match self . peek ( ) {
375
- Some ( b'-' ) | Some ( b'0' ..=b'9' ) | Some ( b'.' ) | Some ( b'e' ) | Some ( b'E' ) => {
376
- self . eat_char ( ) ;
377
- } ,
378
- Some ( _) => {
379
- let s = str:: from_utf8 ( & self . slice [ start..self . index ] )
380
- . or ( Err ( Error :: InvalidNumber ) ) ?;
381
- let v = f32:: from_str ( s)
382
- . or ( Err ( Error :: InvalidNumber ) ) ?;
383
- return visitor. visit_f32 ( v) ;
384
- } ,
385
- None => return Err ( Error :: EofWhileParsingNumber ) ,
386
- }
387
- }
392
+ deserialize_fromstr ! ( self , visitor, f32 , visit_f32, b"-0123456789.eE" )
388
393
}
389
394
390
- fn deserialize_f64 < V > ( self , _visitor : V ) -> Result < V :: Value >
395
+ fn deserialize_f64 < V > ( self , visitor : V ) -> Result < V :: Value >
391
396
where
392
397
V : Visitor < ' de > ,
393
398
{
394
- unreachable ! ( )
399
+ self . parse_whitespace ( ) . ok_or ( Error :: EofWhileParsingValue ) ?;
400
+ deserialize_fromstr ! ( self , visitor, f64 , visit_f64, b"-0123456789.eE" )
395
401
}
396
402
397
403
fn deserialize_char < V > ( self , _visitor : V ) -> Result < V :: Value >
0 commit comments