19771977// Also, macros should be imported before using them
19781978use serde:: serde_if_integer128;
19791979
1980- macro_rules! deserialize_num {
1981- ( $deserialize: ident => $visit: ident, $( $mut: tt) ?) => {
1980+ macro_rules! forward_to_simple_type {
1981+ ( $deserialize: ident, $( $mut: tt) ?) => {
1982+ #[ inline]
19821983 fn $deserialize<V >( $( $mut) ? self , visitor: V ) -> Result <V :: Value , DeError >
19831984 where
19841985 V : Visitor <' de>,
19851986 {
1986- // No need to unescape because valid integer representations cannot be escaped
1987- let text = self . read_string( ) ?;
1988- match text. parse( ) {
1989- Ok ( number) => visitor. $visit( number) ,
1990- Err ( _) => match text {
1991- Cow :: Borrowed ( t) => visitor. visit_str( t) ,
1992- Cow :: Owned ( t) => visitor. visit_string( t) ,
1993- }
1994- }
1987+ SimpleTypeDeserializer :: from_text( self . read_string( ) ?) . $deserialize( visitor)
19951988 }
19961989 } ;
19971990}
@@ -2000,63 +1993,29 @@ macro_rules! deserialize_num {
20001993/// byte arrays, booleans and identifiers.
20011994macro_rules! deserialize_primitives {
20021995 ( $( $mut: tt) ?) => {
2003- deserialize_num !( deserialize_i8 => visit_i8 , $( $mut) ?) ;
2004- deserialize_num !( deserialize_i16 => visit_i16 , $( $mut) ?) ;
2005- deserialize_num !( deserialize_i32 => visit_i32 , $( $mut) ?) ;
2006- deserialize_num !( deserialize_i64 => visit_i64 , $( $mut) ?) ;
1996+ forward_to_simple_type !( deserialize_i8, $( $mut) ?) ;
1997+ forward_to_simple_type !( deserialize_i16, $( $mut) ?) ;
1998+ forward_to_simple_type !( deserialize_i32, $( $mut) ?) ;
1999+ forward_to_simple_type !( deserialize_i64, $( $mut) ?) ;
20072000
2008- deserialize_num !( deserialize_u8 => visit_u8 , $( $mut) ?) ;
2009- deserialize_num !( deserialize_u16 => visit_u16 , $( $mut) ?) ;
2010- deserialize_num !( deserialize_u32 => visit_u32 , $( $mut) ?) ;
2011- deserialize_num !( deserialize_u64 => visit_u64 , $( $mut) ?) ;
2001+ forward_to_simple_type !( deserialize_u8, $( $mut) ?) ;
2002+ forward_to_simple_type !( deserialize_u16, $( $mut) ?) ;
2003+ forward_to_simple_type !( deserialize_u32, $( $mut) ?) ;
2004+ forward_to_simple_type !( deserialize_u64, $( $mut) ?) ;
20122005
20132006 serde_if_integer128! {
2014- deserialize_num !( deserialize_i128 => visit_i128 , $( $mut) ?) ;
2015- deserialize_num !( deserialize_u128 => visit_u128 , $( $mut) ?) ;
2007+ forward_to_simple_type !( deserialize_i128, $( $mut) ?) ;
2008+ forward_to_simple_type !( deserialize_u128, $( $mut) ?) ;
20162009 }
20172010
2018- deserialize_num !( deserialize_f32 => visit_f32 , $( $mut) ?) ;
2019- deserialize_num !( deserialize_f64 => visit_f64 , $( $mut) ?) ;
2011+ forward_to_simple_type !( deserialize_f32, $( $mut) ?) ;
2012+ forward_to_simple_type !( deserialize_f64, $( $mut) ?) ;
20202013
2021- fn deserialize_bool<V >( $( $mut) ? self , visitor: V ) -> Result <V :: Value , DeError >
2022- where
2023- V : Visitor <' de>,
2024- {
2025- let text = match self . read_string( ) ? {
2026- Cow :: Borrowed ( s) => CowRef :: Input ( s) ,
2027- Cow :: Owned ( s) => CowRef :: Owned ( s) ,
2028- } ;
2029- text. deserialize_bool( visitor)
2030- }
2014+ forward_to_simple_type!( deserialize_bool, $( $mut) ?) ;
2015+ forward_to_simple_type!( deserialize_char, $( $mut) ?) ;
20312016
2032- /// Character represented as [strings](#method.deserialize_str).
2033- #[ inline]
2034- fn deserialize_char<V >( self , visitor: V ) -> Result <V :: Value , DeError >
2035- where
2036- V : Visitor <' de>,
2037- {
2038- self . deserialize_str( visitor)
2039- }
2040-
2041- fn deserialize_str<V >( $( $mut) ? self , visitor: V ) -> Result <V :: Value , DeError >
2042- where
2043- V : Visitor <' de>,
2044- {
2045- let text = self . read_string( ) ?;
2046- match text {
2047- Cow :: Borrowed ( string) => visitor. visit_borrowed_str( string) ,
2048- Cow :: Owned ( string) => visitor. visit_string( string) ,
2049- }
2050- }
2051-
2052- /// Representation of owned strings the same as [non-owned](#method.deserialize_str).
2053- #[ inline]
2054- fn deserialize_string<V >( self , visitor: V ) -> Result <V :: Value , DeError >
2055- where
2056- V : Visitor <' de>,
2057- {
2058- self . deserialize_str( visitor)
2059- }
2017+ forward_to_simple_type!( deserialize_str, $( $mut) ?) ;
2018+ forward_to_simple_type!( deserialize_string, $( $mut) ?) ;
20602019
20612020 /// Forwards deserialization to the [`deserialize_any`](#method.deserialize_any).
20622021 #[ inline]
@@ -2163,7 +2122,6 @@ use crate::{
21632122 events:: { BytesCData , BytesEnd , BytesRef , BytesStart , BytesText , Event } ,
21642123 name:: QName ,
21652124 reader:: NsReader ,
2166- utils:: CowRef ,
21672125} ;
21682126use serde:: de:: {
21692127 self , Deserialize , DeserializeOwned , DeserializeSeed , IntoDeserializer , SeqAccess , Visitor ,
@@ -2921,13 +2879,17 @@ where
29212879 /// [`CData`]: Event::CData
29222880 fn read_string_impl ( & mut self , allow_start : bool ) -> Result < Cow < ' de , str > , DeError > {
29232881 match self . next ( ) ? {
2882+ // Reached by doc tests only: this file, lines 979 and 996
29242883 DeEvent :: Text ( e) => Ok ( e. text ) ,
29252884 // allow one nested level
2885+ // Reached by trivial::{...}::{field, field_nested, field_tag_after, field_tag_before, nested, tag_after, tag_before, wrapped}
29262886 DeEvent :: Start ( e) if allow_start => self . read_text ( e. name ( ) ) ,
2887+ // TODO: not reached by any tests
29272888 DeEvent :: Start ( e) => Err ( DeError :: UnexpectedStart ( e. name ( ) . as_ref ( ) . to_owned ( ) ) ) ,
29282889 // SAFETY: The reader is guaranteed that we don't have unmatched tags
29292890 // If we here, then our deserializer has a bug
29302891 DeEvent :: End ( e) => unreachable ! ( "{:?}" , e) ,
2892+ // Reached by trivial::{empty_doc, only_comment}
29312893 DeEvent :: Eof => Err ( DeError :: UnexpectedEof ) ,
29322894 }
29332895 }
@@ -2941,17 +2903,23 @@ where
29412903 match self . next ( ) ? {
29422904 DeEvent :: Text ( e) => match self . next ( ) ? {
29432905 // The matching tag name is guaranteed by the reader
2906+ // Reached by trivial::{...}::{field, wrapped}
29442907 DeEvent :: End ( _) => Ok ( e. text ) ,
29452908 // SAFETY: Cannot be two consequent Text events, they would be merged into one
29462909 DeEvent :: Text ( _) => unreachable ! ( ) ,
2910+ // Reached by trivial::{...}::{field_tag_after, tag_after}
29472911 DeEvent :: Start ( e) => Err ( DeError :: UnexpectedStart ( e. name ( ) . as_ref ( ) . to_owned ( ) ) ) ,
2912+ // Reached by struct_::non_closed::elements_child
29482913 DeEvent :: Eof => Err ( Error :: missed_end ( name, self . reader . decoder ( ) ) . into ( ) ) ,
29492914 } ,
29502915 // We can get End event in case of `<tag></tag>` or `<tag/>` input
29512916 // Return empty text in that case
29522917 // The matching tag name is guaranteed by the reader
2918+ // Reached by {...}::xs_list::empty
29532919 DeEvent :: End ( _) => Ok ( "" . into ( ) ) ,
2920+ // Reached by trivial::{...}::{field_nested, field_tag_before, nested, tag_before}
29542921 DeEvent :: Start ( s) => Err ( DeError :: UnexpectedStart ( s. name ( ) . as_ref ( ) . to_owned ( ) ) ) ,
2922+ // Reached by struct_::non_closed::elements_child
29552923 DeEvent :: Eof => Err ( Error :: missed_end ( name, self . reader . decoder ( ) ) . into ( ) ) ,
29562924 }
29572925 }
0 commit comments