use crate::de::{DeError, DeEvent, Deserializer, XmlRead};
use crate::events::BytesStart;
use serde::de::{self, DeserializeSeed};
#[derive(Debug)]
enum Names {
Unknown,
Peek(Vec<u8>),
}
impl Names {
fn is_valid(&self, start: &BytesStart) -> bool {
match self {
Names::Unknown => true,
Names::Peek(n) => n == start.name(),
}
}
}
pub struct SeqAccess<'de, 'a, R>
where
R: XmlRead<'de>,
{
de: &'a mut Deserializer<'de, R>,
names: Names,
}
impl<'a, 'de, R> SeqAccess<'de, 'a, R>
where
R: XmlRead<'de>,
{
pub fn new(de: &'a mut Deserializer<'de, R>) -> Result<Self, DeError> {
let names = if de.has_value_field {
Names::Unknown
} else {
if let DeEvent::Start(e) = de.peek()? {
Names::Peek(e.name().to_vec())
} else {
Names::Unknown
}
};
Ok(SeqAccess { de, names })
}
}
impl<'de, 'a, R> de::SeqAccess<'de> for SeqAccess<'de, 'a, R>
where
R: XmlRead<'de>,
{
type Error = DeError;
fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, DeError>
where
T: DeserializeSeed<'de>,
{
match self.de.peek()? {
DeEvent::Eof | DeEvent::End(_) => Ok(None),
DeEvent::Start(e) if !self.names.is_valid(e) => Ok(None),
_ => seed.deserialize(&mut *self.de).map(Some),
}
}
}