@@ -311,23 +311,32 @@ macro_rules! deserialize_signed {
311
311
312
312
macro_rules! deserialize_fromstr {
313
313
( $self: ident, $visitor: ident, $typ: ident, $visit_fn: ident, $pattern: expr) => { {
314
- let start = $self. index;
315
- while $self. peek( ) . is_some( ) {
316
- let c = $self. peek( ) . unwrap( ) ;
317
- if $pattern. iter( ) . find( |&&d| d == c) . is_some( ) {
314
+ match $self. parse_whitespace( ) . ok_or( Error :: EofWhileParsingValue ) ? {
315
+ b'n' => {
318
316
$self. eat_char( ) ;
319
- } else {
320
- break ;
317
+ $self . parse_ident ( b"ull" ) ? ;
318
+ $visitor . $visit_fn ( $typ :: NAN )
321
319
}
322
- }
320
+ _ => {
321
+ let start = $self. index;
322
+ while $self. peek( ) . is_some( ) {
323
+ let c = $self. peek( ) . unwrap( ) ;
324
+ if $pattern. iter( ) . find( |&&d| d == c) . is_some( ) {
325
+ $self. eat_char( ) ;
326
+ } else {
327
+ break ;
328
+ }
329
+ }
323
330
324
- // Note(unsafe): We already checked that it only contains ascii. This is only true if the
325
- // caller has guaranteed that `pattern` contains only ascii characters.
326
- let s = unsafe { str :: from_utf8_unchecked( & $self. slice[ start..$self. index] ) } ;
331
+ // Note(unsafe): We already checked that it only contains ascii. This is only true if the
332
+ // caller has guaranteed that `pattern` contains only ascii characters.
333
+ let s = unsafe { str :: from_utf8_unchecked( & $self. slice[ start..$self. index] ) } ;
327
334
328
- let v = $typ:: from_str( s) . or( Err ( Error :: InvalidNumber ) ) ?;
335
+ let v = $typ:: from_str( s) . or( Err ( Error :: InvalidNumber ) ) ?;
329
336
330
- $visitor. $visit_fn( v)
337
+ $visitor. $visit_fn( v)
338
+ }
339
+ }
331
340
} } ;
332
341
}
333
342
@@ -423,15 +432,13 @@ impl<'a, 'de> de::Deserializer<'de> for &'a mut Deserializer<'de> {
423
432
where
424
433
V : Visitor < ' de > ,
425
434
{
426
- self . parse_whitespace ( ) . ok_or ( Error :: EofWhileParsingValue ) ?;
427
435
deserialize_fromstr ! ( self , visitor, f32 , visit_f32, b"0123456789+-.eE" )
428
436
}
429
437
430
438
fn deserialize_f64 < V > ( self , visitor : V ) -> Result < V :: Value >
431
439
where
432
440
V : Visitor < ' de > ,
433
441
{
434
- self . parse_whitespace ( ) . ok_or ( Error :: EofWhileParsingValue ) ?;
435
442
deserialize_fromstr ! ( self , visitor, f64 , visit_f64, b"0123456789+-.eE" )
436
443
}
437
444
@@ -941,11 +948,17 @@ mod tests {
941
948
) )
942
949
) ;
943
950
951
+ // NaNs will always compare unequal.
952
+ let ( r, n) : ( Temperature , usize ) = crate :: from_str ( r#"{ "temperature": null }"# ) . unwrap ( ) ;
953
+ assert ! ( r. temperature. is_nan( ) ) ;
954
+ assert_eq ! ( n, 23 ) ;
955
+
944
956
assert ! ( crate :: from_str:: <Temperature >( r#"{ "temperature": 1e1e1 }"# ) . is_err( ) ) ;
945
957
assert ! ( crate :: from_str:: <Temperature >( r#"{ "temperature": -2-2 }"# ) . is_err( ) ) ;
946
958
assert ! ( crate :: from_str:: <Temperature >( r#"{ "temperature": 1 1 }"# ) . is_err( ) ) ;
947
959
assert ! ( crate :: from_str:: <Temperature >( r#"{ "temperature": 0.0. }"# ) . is_err( ) ) ;
948
960
assert ! ( crate :: from_str:: <Temperature >( r#"{ "temperature": ä }"# ) . is_err( ) ) ;
961
+ assert ! ( crate :: from_str:: <Temperature >( r#"{ "temperature": None }"# ) . is_err( ) ) ;
949
962
}
950
963
951
964
#[ test]
0 commit comments