1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
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 } }