diff --git a/src/de/mod.rs b/src/de/mod.rs index a9f9dbb..f4600e6 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -45,8 +45,8 @@ impl<'de> Deserializer<'de> { Ok(Self { read_mode: ReadMode::Single, - first_struct: true, node_stack: Vec::new(), + first_struct: true, reader, }) } @@ -217,12 +217,12 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> { { trace!("Deserializer::deserialize_seq()"); - let node_type = *self.node_stack.last().ok_or(KbinErrorKind::InvalidState)?; + let (node_type, _) = self.reader.last_node_type().ok_or(KbinErrorKind::InvalidState)?; // If the last node type on the stack is a `NodeStart` then we are likely // collecting a list of structs let value = if node_type == StandardType::NodeStart { - visitor.visit_seq(Seq::new(self, None))? + visitor.visit_seq(Seq::new(self, None)?)? } else { // TODO: add size check against len let size = self.reader.read_u32().context(KbinErrorKind::ArrayLengthRead)?; @@ -231,7 +231,7 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> { // Changes to `self.read_mode` must stay here as `next_element_seed` is not // called past the length of the array to reset the read mode self.read_mode = ReadMode::Array; - let value = visitor.visit_seq(Seq::new(self, Some(size as usize)))?; + let value = visitor.visit_seq(Seq::new(self, Some(size as usize))?)?; self.read_mode = ReadMode::Single; self.reader.data_buf.realign_reads(None)?; @@ -255,7 +255,7 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> { trace!("Deserializer::deserialize_tuple_struct(name: {:?}, len: {})", name, len); self.read_mode = ReadMode::Array; - let value = visitor.visit_seq(Seq::new(self, Some(len)))?; + let value = visitor.visit_seq(Seq::new(self, Some(len))?)?; self.read_mode = ReadMode::Single; self.reader.data_buf.realign_reads(None)?; diff --git a/src/de/seq.rs b/src/de/seq.rs index 700423c..268fe40 100644 --- a/src/de/seq.rs +++ b/src/de/seq.rs @@ -12,11 +12,11 @@ pub struct Seq<'a, 'de: 'a> { } impl<'de, 'a> Seq<'a, 'de> { - pub fn new(de: &'a mut Deserializer<'de>, len: Option) -> Self { + pub fn new(de: &'a mut Deserializer<'de>, len: Option) -> Result { trace!("Seq::new(len: {:?})", len); let known_identifier = if len.is_none() { - let value = de.reader.last_identifier().expect("known identifier null").into(); + let value = de.reader.last_identifier().ok_or(KbinErrorKind::InvalidState)?.into(); debug!("Seq::new(len: {:?}) => known identifier: {:?}", len, value); Some(value) @@ -24,12 +24,12 @@ impl<'de, 'a> Seq<'a, 'de> { None }; - Self { + Ok(Self { de, index: 0, len, known_identifier, - } + }) } fn is_end(&mut self) -> Result { diff --git a/src/de/structure.rs b/src/de/structure.rs index e313495..82b6f33 100644 --- a/src/de/structure.rs +++ b/src/de/structure.rs @@ -34,7 +34,7 @@ impl<'de, 'a> MapAccess<'de> for Struct<'a, 'de> { return Ok(None); } - let value = seed.deserialize(&mut *self.de).map(Some)?; + let key = seed.deserialize(&mut *self.de).map(Some)?; match node_type { StandardType::NodeStart => { @@ -56,7 +56,7 @@ impl<'de, 'a> MapAccess<'de> for Struct<'a, 'de> { // the current node type self.de.node_stack.push(node_type); - Ok(value) + Ok(key) } fn next_value_seed(&mut self, seed: V) -> Result