From 7280390e4cab8f9eb2eb1b2c9d3800477d325901 Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 10 Jul 2022 22:32:37 +0500 Subject: [PATCH] Implement `From` for BytesStart and BytesEnd Use new conversion whenever possible for reader. This will help later, when events for reader and writer will split --- Changelog.md | 2 + src/de/mod.rs | 124 ++++++++++++++++++---------------------------- src/de/seq.rs | 4 +- src/events/mod.rs | 15 +++++- src/reader.rs | 21 ++++---- 5 files changed, 78 insertions(+), 88 deletions(-) diff --git a/Changelog.md b/Changelog.md index 91dee4f6..0532ee91 100644 --- a/Changelog.md +++ b/Changelog.md @@ -25,6 +25,7 @@ - [#395]: Add support for XML Schema `xs:list` - [#324]: `Reader::from_str` / `Deserializer::from_str` / `from_str` now ignore the XML declared encoding and always use UTF-8 +- [#416]: Add `From` for `BytesStart` and `BytesEnd` ### Bug Fixes @@ -131,6 +132,7 @@ [#403]: https://github.com/tafia/quick-xml/pull/403 [#407]: https://github.com/tafia/quick-xml/pull/407 [#412]: https://github.com/tafia/quick-xml/pull/412 +[#416]: https://github.com/tafia/quick-xml/pull/416 ## 0.23.0 -- 2022-05-08 diff --git a/src/de/mod.rs b/src/de/mod.rs index 85949d8a..e1f9f1f4 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -1031,7 +1031,7 @@ mod tests { mod skip { use super::*; use crate::de::DeEvent::*; - use crate::events::{BytesEnd, BytesText}; + use crate::events::BytesText; use pretty_assertions::assert_eq; /// Checks that `peek()` and `read()` behaves correctly after `skip()` @@ -1054,14 +1054,8 @@ mod tests { assert_eq!(de.read, vec![]); assert_eq!(de.write, vec![]); - assert_eq!( - de.next().unwrap(), - Start(BytesStart::borrowed_name(b"root")) - ); - assert_eq!( - de.peek().unwrap(), - &Start(BytesStart::borrowed_name(b"inner")) - ); + assert_eq!(de.next().unwrap(), Start(QName(b"root").into())); + assert_eq!(de.peek().unwrap(), &Start(QName(b"inner").into())); // Should skip first tree de.skip().unwrap(); @@ -1069,11 +1063,11 @@ mod tests { assert_eq!( de.write, vec![ - Start(BytesStart::borrowed_name(b"inner")), + Start(QName(b"inner").into()), Text(BytesText::from_escaped_str("text")), - Start(BytesStart::borrowed_name(b"inner")), - End(BytesEnd::borrowed(b"inner")), - End(BytesEnd::borrowed(b"inner")), + Start(QName(b"inner").into()), + End(QName(b"inner").into()), + End(QName(b"inner").into()), ] ); @@ -1085,11 +1079,8 @@ mod tests { // // // - assert_eq!( - de.next().unwrap(), - Start(BytesStart::borrowed_name(b"next")) - ); - assert_eq!(de.next().unwrap(), End(BytesEnd::borrowed(b"next"))); + assert_eq!(de.next().unwrap(), Start(QName(b"next").into())); + assert_eq!(de.next().unwrap(), End(QName(b"next").into())); // We finish writing. Next call to `next()` should start replay that messages: // @@ -1106,27 +1097,24 @@ mod tests { assert_eq!( de.read, vec![ - Start(BytesStart::borrowed_name(b"inner")), + Start(QName(b"inner").into()), Text(BytesText::from_escaped_str("text")), - Start(BytesStart::borrowed_name(b"inner")), - End(BytesEnd::borrowed(b"inner")), - End(BytesEnd::borrowed(b"inner")), + Start(QName(b"inner").into()), + End(QName(b"inner").into()), + End(QName(b"inner").into()), ] ); assert_eq!(de.write, vec![]); - assert_eq!( - de.next().unwrap(), - Start(BytesStart::borrowed_name(b"inner")) - ); + assert_eq!(de.next().unwrap(), Start(QName(b"inner").into())); // Skip `#text` node and consume after it de.skip().unwrap(); assert_eq!( de.read, vec![ - Start(BytesStart::borrowed_name(b"inner")), - End(BytesEnd::borrowed(b"inner")), - End(BytesEnd::borrowed(b"inner")), + Start(QName(b"inner").into()), + End(QName(b"inner").into()), + End(QName(b"inner").into()), ] ); assert_eq!( @@ -1138,11 +1126,8 @@ mod tests { ] ); - assert_eq!( - de.next().unwrap(), - Start(BytesStart::borrowed_name(b"inner")) - ); - assert_eq!(de.next().unwrap(), End(BytesEnd::borrowed(b"inner"))); + assert_eq!(de.next().unwrap(), Start(QName(b"inner").into())); + assert_eq!(de.next().unwrap(), End(QName(b"inner").into())); // We finish writing. Next call to `next()` should start replay messages: // @@ -1158,7 +1143,7 @@ mod tests { de.read, vec![ Text(BytesText::from_escaped_str("text")), - End(BytesEnd::borrowed(b"inner")), + End(QName(b"inner").into()), ] ); assert_eq!(de.write, vec![]); @@ -1166,13 +1151,10 @@ mod tests { de.next().unwrap(), Text(BytesText::from_escaped_str("text")) ); - assert_eq!(de.next().unwrap(), End(BytesEnd::borrowed(b"inner"))); - assert_eq!( - de.next().unwrap(), - Start(BytesStart::borrowed_name(b"target")) - ); - assert_eq!(de.next().unwrap(), End(BytesEnd::borrowed(b"target"))); - assert_eq!(de.next().unwrap(), End(BytesEnd::borrowed(b"root"))); + assert_eq!(de.next().unwrap(), End(QName(b"inner").into())); + assert_eq!(de.next().unwrap(), Start(QName(b"target").into())); + assert_eq!(de.next().unwrap(), End(QName(b"target").into())); + assert_eq!(de.next().unwrap(), End(QName(b"root").into())); } /// Checks that `read_to_end()` behaves correctly after `skip()` @@ -1196,10 +1178,7 @@ mod tests { assert_eq!(de.read, vec![]); assert_eq!(de.write, vec![]); - assert_eq!( - de.next().unwrap(), - Start(BytesStart::borrowed_name(b"root")) - ); + assert_eq!(de.next().unwrap(), Start(QName(b"root").into())); // Skip the tree de.skip().unwrap(); @@ -1207,11 +1186,11 @@ mod tests { assert_eq!( de.write, vec![ - Start(BytesStart::borrowed_name(b"skip")), + Start(QName(b"skip").into()), Text(BytesText::from_escaped_str("text")), - Start(BytesStart::borrowed_name(b"skip")), - End(BytesEnd::borrowed(b"skip")), - End(BytesEnd::borrowed(b"skip")), + Start(QName(b"skip").into()), + End(QName(b"skip").into()), + End(QName(b"skip").into()), ] ); @@ -1222,20 +1201,17 @@ mod tests { // // // - assert_eq!( - de.next().unwrap(), - Start(BytesStart::borrowed_name(b"target")) - ); + assert_eq!(de.next().unwrap(), Start(QName(b"target").into())); de.read_to_end(QName(b"target")).unwrap(); assert_eq!(de.read, vec![]); assert_eq!( de.write, vec![ - Start(BytesStart::borrowed_name(b"skip")), + Start(QName(b"skip").into()), Text(BytesText::from_escaped_str("text")), - Start(BytesStart::borrowed_name(b"skip")), - End(BytesEnd::borrowed(b"skip")), - End(BytesEnd::borrowed(b"skip")), + Start(QName(b"skip").into()), + End(QName(b"skip").into()), + End(QName(b"skip").into()), ] ); @@ -1253,22 +1229,19 @@ mod tests { assert_eq!( de.read, vec![ - Start(BytesStart::borrowed_name(b"skip")), + Start(QName(b"skip").into()), Text(BytesText::from_escaped_str("text")), - Start(BytesStart::borrowed_name(b"skip")), - End(BytesEnd::borrowed(b"skip")), - End(BytesEnd::borrowed(b"skip")), + Start(QName(b"skip").into()), + End(QName(b"skip").into()), + End(QName(b"skip").into()), ] ); assert_eq!(de.write, vec![]); - assert_eq!( - de.next().unwrap(), - Start(BytesStart::borrowed_name(b"skip")) - ); + assert_eq!(de.next().unwrap(), Start(QName(b"skip").into())); de.read_to_end(QName(b"skip")).unwrap(); - assert_eq!(de.next().unwrap(), End(BytesEnd::borrowed(b"root"))); + assert_eq!(de.next().unwrap(), End(QName(b"root").into())); } /// Checks that limiting buffer size works correctly @@ -1318,10 +1291,7 @@ mod tests { "#, ); - assert_eq!( - de.next().unwrap(), - Start(BytesStart::borrowed_name(b"root")) - ); + assert_eq!(de.next().unwrap(), Start(QName(b"root").into())); assert_eq!( de.next().unwrap(), @@ -1337,7 +1307,7 @@ mod tests { de.next().unwrap(), CData(BytesCData::from_str("cdata content")) ); - assert_eq!(de.next().unwrap(), End(BytesEnd::borrowed(b"tag"))); + assert_eq!(de.next().unwrap(), End(QName(b"tag").into())); assert_eq!( de.next().unwrap(), @@ -1345,7 +1315,7 @@ mod tests { ); assert_eq!(de.read_to_end(QName(b"self-closed")).unwrap(), ()); - assert_eq!(de.next().unwrap(), End(BytesEnd::borrowed(b"root"))); + assert_eq!(de.next().unwrap(), End(QName(b"root").into())); assert_eq!(de.next().unwrap(), Eof); } @@ -1418,13 +1388,13 @@ mod tests { 4 )), Text(BytesText::from_escaped(b"Some text".as_ref())), - End(BytesEnd::borrowed(b"item")), + End(QName(b"item").into()), Start(BytesStart::borrowed(b"item2", 5)), - End(BytesEnd::borrowed(b"item2")), + End(QName(b"item2").into()), Start(BytesStart::borrowed(b"item3", 5)), - End(BytesEnd::borrowed(b"item3")), + End(QName(b"item3").into()), Start(BytesStart::borrowed(br#"item4 value="world" "#, 5)), - End(BytesEnd::borrowed(b"item4")), + End(QName(b"item4").into()), ] ) } diff --git a/src/de/seq.rs b/src/de/seq.rs index fe4559bd..cffe6522 100644 --- a/src/de/seq.rs +++ b/src/de/seq.rs @@ -134,7 +134,9 @@ where #[test] fn test_not_in() { - let tag = BytesStart::borrowed_name(b"tag"); + use crate::name::QName; + + let tag = BytesStart::from(QName(b"tag")); assert_eq!(not_in(&[], &tag, Decoder::utf8()).unwrap(), true); assert_eq!( diff --git a/src/events/mod.rs b/src/events/mod.rs index d7ebd115..e424e4d0 100644 --- a/src/events/mod.rs +++ b/src/events/mod.rs @@ -209,7 +209,7 @@ impl<'a> BytesStart<'a> { /// Creates new paired close tag pub fn to_end(&self) -> BytesEnd { - BytesEnd::borrowed(self.name().into_inner()) + BytesEnd::from(self.name()) } /// Gets the undecoded raw tag name, as present in the input stream. @@ -336,6 +336,13 @@ impl<'a> Deref for BytesStart<'a> { } } +impl<'a> From> for BytesStart<'a> { + fn from(name: QName<'a>) -> Self { + let len = name.as_ref().len(); + Self::borrowed(name.into_inner(), len) + } +} + //////////////////////////////////////////////////////////////////////////////////////////////////// /// An XML declaration (`Event::Decl`). @@ -640,6 +647,12 @@ impl<'a> Deref for BytesEnd<'a> { } } +impl<'a> From> for BytesEnd<'a> { + fn from(name: QName<'a>) -> Self { + Self::borrowed(name.into_inner()) + } +} + //////////////////////////////////////////////////////////////////////////////////////////////////// /// Data from various events (most notably, `Event::Text`) that stored in XML diff --git a/src/reader.rs b/src/reader.rs index 9a967fba..173987de 100644 --- a/src/reader.rs +++ b/src/reader.rs @@ -652,6 +652,7 @@ impl Reader { /// /// ``` /// # use pretty_assertions::assert_eq; + /// use quick_xml::name::QName; /// use quick_xml::events::{BytesStart, Event}; /// use quick_xml::Reader; /// @@ -668,7 +669,7 @@ impl Reader { /// reader.trim_text(true); /// let mut buf = Vec::new(); /// - /// let start = BytesStart::borrowed_name(b"outer"); + /// let start = BytesStart::from(QName(b"outer")); /// let end = start.to_end().into_owned(); /// /// // First, we read a start event... @@ -946,13 +947,13 @@ impl Reader { mismatch_err(expected, name, &mut self.buf_position) } else { self.opened_buffer.truncate(start); - Ok(Event::End(BytesEnd::borrowed(name))) + Ok(Event::End(QName(name).into())) } } None => mismatch_err(b"", &buf[1..], &mut self.buf_position), } } else { - Ok(Event::End(BytesEnd::borrowed(name))) + Ok(Event::End(QName(name).into())) } } @@ -1087,6 +1088,7 @@ impl<'a> Reader<&'a [u8]> { /// /// ``` /// # use pretty_assertions::assert_eq; + /// use quick_xml::name::QName; /// use quick_xml::events::{BytesStart, Event}; /// use quick_xml::Reader; /// @@ -1102,7 +1104,7 @@ impl<'a> Reader<&'a [u8]> { /// "#); /// reader.trim_text(true); /// - /// let start = BytesStart::borrowed_name(b"outer"); + /// let start = BytesStart::from(QName(b"outer")); /// let end = start.to_end().into_owned(); /// /// // First, we read a start event... @@ -2553,7 +2555,8 @@ mod test { /// Ensures, that no empty `Text` events are generated mod read_event_impl { - use crate::events::{BytesCData, BytesDecl, BytesEnd, BytesStart, BytesText, Event}; + use crate::name::QName; + use crate::events::{BytesCData, BytesDecl, BytesStart, BytesText, Event}; use crate::reader::Reader; use pretty_assertions::assert_eq; @@ -2603,7 +2606,7 @@ mod test { assert_eq!( reader.read_event_impl($buf).unwrap(), - Event::Start(BytesStart::borrowed_name(b"tag")) + Event::Start(QName(b"tag").into()) ); } @@ -2616,7 +2619,7 @@ mod test { assert_eq!( reader.read_event_impl($buf).unwrap(), - Event::End(BytesEnd::borrowed(b"tag")) + Event::End(QName(b"tag").into()) ); } @@ -2626,7 +2629,7 @@ mod test { assert_eq!( reader.read_event_impl($buf).unwrap(), - Event::Empty(BytesStart::borrowed_name(b"tag")) + Event::Empty(QName(b"tag").into()) ); } @@ -2637,7 +2640,7 @@ mod test { assert_eq!( reader.read_event_impl($buf).unwrap(), - Event::Empty(BytesStart::borrowed_name(b"tag")) + Event::Empty(QName(b"tag").into()) ); assert_eq!(