blob: 7e88d0cc33e732755be64bc28726b630f0ec2c6a [file] [log] [blame]
use std::io::Read;
use serde::de;
use xml::reader::XmlEvent;
use de::Deserializer;
use error::{Error, Result};
pub struct SeqAccess<'a, R: 'a + Read> {
de: &'a mut Deserializer<R>,
max_size: Option<usize>,
expected_name: Option<String>,
}
impl<'a, R: 'a + Read> SeqAccess<'a, R> {
pub fn new(de: &'a mut Deserializer<R>, max_size: Option<usize>) -> Self {
let expected_name = if de.unset_map_value() {
debug_expect!(de.peek(), Ok(&XmlEvent::StartElement { ref name, .. }) => {
Some(name.local_name.clone())
})
} else {
None
};
SeqAccess {
de: de,
max_size: max_size,
expected_name: expected_name,
}
}
}
impl<'de, 'a, R: 'a + Read> de::SeqAccess<'de> for SeqAccess<'a, R> {
type Error = Error;
fn next_element_seed<T: de::DeserializeSeed<'de>>(
&mut self,
seed: T,
) -> Result<Option<T::Value>> {
match self.max_size.as_mut() {
Some(&mut 0) => {
return Ok(None);
},
Some(max_size) => {
*max_size -= 1;
},
None => {},
}
let more = match (self.de.peek()?, self.expected_name.as_ref()) {
(&XmlEvent::StartElement { ref name, .. }, Some(expected_name)) => {
&name.local_name == expected_name
},
(&XmlEvent::EndElement { .. }, None) |
(_, Some(_)) |
(&XmlEvent::EndDocument { .. }, _) => false,
(_, None) => true,
};
if more {
if self.expected_name.is_some() {
self.de.set_map_value();
}
seed.deserialize(&mut *self.de).map(Some)
} else {
Ok(None)
}
}
fn size_hint(&self) -> Option<usize> {
self.max_size
}
}