Refactor reader

This commit is contained in:
Dmitry Samoylov 2020-04-06 18:12:17 +07:00
parent 7dc5ee975c
commit d262bc998f
3 changed files with 18 additions and 44 deletions

View File

@ -18,7 +18,6 @@ pub struct Deserializer<R: Read> {
depth: usize,
reader: EventReader<R>,
peeked: Option<XmlEvent>,
is_map_value: bool,
}
impl<'de, R: Read> Deserializer<R> {
@ -27,7 +26,6 @@ impl<'de, R: Read> Deserializer<R> {
depth: 0,
reader,
peeked: None,
is_map_value: false,
}
}
@ -105,19 +103,10 @@ impl<'de, R: Read> Deserializer<R> {
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<T, F: FnOnce(&mut Self) -> Result<T, String>>(
&mut self,
f: F,
) -> Result<T, String> {
if self.unset_map_value() {
if let Ok(XmlEvent::StartElement { name, .. }) = self.next_event() {
let result = f(self)?;
self.expect_end_element(&name)?;
@ -125,9 +114,6 @@ impl<'de, R: Read> Deserializer<R> {
} else {
Err("Internal error: Bad Event".to_string())
}
} else {
f(self)
}
}
pub fn expect_end_element(&mut self, start_name: &OwnedName) -> Result<(), String> {

View File

@ -214,8 +214,7 @@ 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 {
if let Some(namespace) = name.namespace.as_ref() {
match namespace.as_str() {
bad_ns => {
let msg = format!("bad field namespace for {}, found {}",
@ -225,8 +224,6 @@ fn build_unnamed_visitor_calls(
}
}
}
reader.set_map_value()
}
let result = reader.read_inner_value::<#field_type, _>(|reader| {
if let XmlEvent::EndElement { .. } = *reader.peek()? {
@ -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;

View File

@ -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,8 +492,7 @@ fn build_call_visitor(
#label_name => {
let visitor = #visitor_label{};
if let XmlEvent::StartElement {name, ..} = reader.peek()?.clone() {
if let Some(namespace) = name.namespace {
if let Some(namespace) = name.namespace.as_ref() {
match namespace.as_str() {
#namespaces_matches
bad_ns => {
@ -503,14 +501,8 @@ fn build_call_visitor(
}
}
}
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 {