From b3c1595caedd0fc20dd6a7b8ead8295cad6f7b0e Mon Sep 17 00:00:00 2001 From: Mingun Date: Mon, 23 Aug 2021 00:52:40 +0500 Subject: [PATCH] Add test for `ignored_any` --- src/de/mod.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/de/mod.rs b/src/de/mod.rs index f27e01b2..f689463b 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -452,10 +452,18 @@ impl<'de, 'a, R: BorrowingReader<'de>> de::Deserializer<'de> for &'a mut Deseria self.deserialize_string(visitor) } + /// Always call `visitor.visit_unit()` because returned value ignored in any case. + /// + /// This method consumes any single [event][Event] except the [`Start`][Event::Start] + /// event. in which case all events up to corresponding [`End`][Event::End] event will + /// be consumed. + /// + /// This method returns error if current event is [`End`][Event::End] or [`Eof`][Event::Eof] fn deserialize_ignored_any>(self, visitor: V) -> Result { match self.next()? { Event::Start(e) => self.read_to_end(e.name())?, Event::End(_) => return Err(DeError::End), + Event::Eof => return Err(DeError::Eof), _ => (), } visitor.visit_unit() @@ -570,6 +578,7 @@ impl<'de> BorrowingReader<'de> for SliceReader<'de> { #[cfg(test)] mod tests { use super::*; + use serde::de::IgnoredAny; use serde::Deserialize; /// Deserialize an instance of type T from a string of XML text. @@ -955,6 +964,22 @@ mod tests { assert_eq!(item, Item); } + /// Tests calling `deserialize_ignored_any` + #[test] + fn ignored_any() { + let err = from_str::(""); + match err { + Err(DeError::Eof) => {} + other => panic!("Expected `Eof`, found {:?}", other), + } + + from_str::(r#""#).unwrap(); + from_str::(r#""#).unwrap(); + from_str::(r#"text"#).unwrap(); + from_str::(r#""#).unwrap(); + from_str::(r#""#).unwrap(); + } + mod unit { use super::*;