From d262bc998f2b451b792404d13614957e2caa46d5 Mon Sep 17 00:00:00 2001 From: Dmitry Samoylov Date: Mon, 6 Apr 2020 18:12:17 +0700 Subject: [PATCH] Refactor reader --- yaserde/src/de/mod.rs | 24 +++++------------------- yaserde_derive/src/de/expand_enum.rs | 18 +++++++----------- yaserde_derive/src/de/expand_struct.rs | 20 ++++++-------------- 3 files changed, 18 insertions(+), 44 deletions(-) diff --git a/yaserde/src/de/mod.rs b/yaserde/src/de/mod.rs index 68938e1..d696092 100644 --- a/yaserde/src/de/mod.rs +++ b/yaserde/src/de/mod.rs @@ -18,7 +18,6 @@ pub struct Deserializer { depth: usize, reader: EventReader, peeked: Option, - is_map_value: bool, } impl<'de, R: Read> Deserializer { @@ -27,7 +26,6 @@ impl<'de, R: Read> Deserializer { depth: 0, reader, peeked: None, - is_map_value: false, } } @@ -105,28 +103,16 @@ impl<'de, R: Read> Deserializer { self.depth } - pub fn set_map_value(&mut self) { - self.is_map_value = true; - } - - pub fn unset_map_value(&mut self) -> bool { - ::std::mem::replace(&mut self.is_map_value, false) - } - pub fn read_inner_value Result>( &mut self, f: F, ) -> Result { - if self.unset_map_value() { - if let Ok(XmlEvent::StartElement { name, .. }) = self.next_event() { - let result = f(self)?; - self.expect_end_element(&name)?; - Ok(result) - } else { - Err("Internal error: Bad Event".to_string()) - } + if let Ok(XmlEvent::StartElement { name, .. }) = self.next_event() { + let result = f(self)?; + self.expect_end_element(&name)?; + Ok(result) } else { - f(self) + Err("Internal error: Bad Event".to_string()) } } diff --git a/yaserde_derive/src/de/expand_enum.rs b/yaserde_derive/src/de/expand_enum.rs index 5368742..6748e5f 100644 --- a/yaserde_derive/src/de/expand_enum.rs +++ b/yaserde_derive/src/de/expand_enum.rs @@ -214,18 +214,15 @@ fn build_unnamed_visitor_calls( Some(quote! { let visitor = #visitor_label{}; - if let XmlEvent::StartElement {name, ..} = reader.peek()?.clone() { - if let Some(namespace) = name.namespace { - match namespace.as_str() { - bad_ns => { - let msg = format!("bad field namespace for {}, found {}", - name.local_name.as_str(), - bad_ns); - return Err(msg); - } + if let Some(namespace) = name.namespace.as_ref() { + match namespace.as_str() { + bad_ns => { + let msg = format!("bad field namespace for {}, found {}", + name.local_name.as_str(), + bad_ns); + return Err(msg); } } - reader.set_map_value() } let result = reader.read_inner_value::<#field_type, _>(|reader| { @@ -248,7 +245,6 @@ fn build_unnamed_visitor_calls( let call_struct_visitor = |struct_name, action| { Some(quote! { - reader.set_map_value(); match #struct_name::deserialize(reader) { Ok(value) => { #action; diff --git a/yaserde_derive/src/de/expand_struct.rs b/yaserde_derive/src/de/expand_struct.rs index 3618ba4..6e21064 100644 --- a/yaserde_derive/src/de/expand_struct.rs +++ b/yaserde_derive/src/de/expand_struct.rs @@ -179,7 +179,6 @@ pub fn parse( let visit_struct = |struct_name: syn::Path, action: TokenStream| { Some(quote! { #label_name => { - reader.set_map_value(); let value = #struct_name::deserialize(reader)?; #value_label #action; let _root = reader.next_event(); @@ -493,24 +492,17 @@ fn build_call_visitor( #label_name => { let visitor = #visitor_label{}; - if let XmlEvent::StartElement {name, ..} = reader.peek()?.clone() { - if let Some(namespace) = name.namespace { - match namespace.as_str() { - #namespaces_matches - bad_ns => { - let msg = format!("bad field namespace for {}, found {}", name.local_name.as_str(), bad_ns); - return Err(msg); - } + if let Some(namespace) = name.namespace.as_ref() { + match namespace.as_str() { + #namespaces_matches + bad_ns => { + let msg = format!("bad field namespace for {}, found {}", name.local_name.as_str(), bad_ns); + return Err(msg); } } - reader.set_map_value() } let result = reader.read_inner_value::<#field_type, _>(|reader| { - if let XmlEvent::EndElement { .. } = *reader.peek()? { - return visitor.#visitor(""); - } - if let Ok(XmlEvent::Characters(s)) = reader.next_event() { visitor.#visitor(&s) } else {