From e73aef07cb34227db8895247319407a4624d4c2f Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 18 Jul 2021 15:56:50 +0500 Subject: [PATCH 1/7] Remove unnecessary #[cfg] option - already applied above --- src/de/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/de/mod.rs b/src/de/mod.rs index a9cfe38d..3be05ff8 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -318,7 +318,6 @@ impl<'de, 'a, R: BorrowingReader<'de>> de::Deserializer<'de> for &'a mut Deseria #[cfg(feature = "encoding")] { - #[cfg(feature = "encoding")] let value = self.reader.decoder().decode(&*txt); match value.as_ref() { From 9287d87d9701fcc9812de13ff55da1d03eb0d687 Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 18 Jul 2021 03:06:06 +0500 Subject: [PATCH 2/7] Document some internal structures --- src/de/map.rs | 9 +++++++++ src/de/mod.rs | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/src/de/map.rs b/src/de/map.rs index 90387ca5..31c590bf 100644 --- a/src/de/map.rs +++ b/src/de/map.rs @@ -9,8 +9,14 @@ use serde::de::{self, DeserializeSeed, IntoDeserializer}; enum MapValue { Empty, + /// Value should be deserialized from the attribute value Attribute { value: Vec }, Nested, + /// Value should be deserialized from the text content of the XML node: + /// + /// ```xml + /// <...>text content for field value<...> + /// ``` InnerValue, } @@ -68,6 +74,9 @@ impl<'de, 'a, R: BorrowingReader<'de> + 'a> de::MapAccess<'de> for MapAccess<'de match self.de.peek()? { Some(Event::Text(_)) => { self.value = MapValue::InnerValue; + // Deserialize `key` from special attribute name which means + // that value should be taken from the text content of the + // XML node seed.deserialize(INNER_VALUE.into_deserializer()).map(Some) } // Used to deserialize collections of enums, like: diff --git a/src/de/mod.rs b/src/de/mod.rs index 3be05ff8..e866c91e 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -130,6 +130,13 @@ pub(crate) const UNFLATTEN_PREFIX: &str = "$unflatten="; pub struct Deserializer<'de, R: BorrowingReader<'de>> { reader: R, peek: Option>, + /// Special sing that deserialized struct have a field with the special + /// name (see constant `INNER_VALUE`). That field should be deserialized + /// from the text content of the XML node: + /// + /// ```xml + /// value for INNER_VALUE field + /// ``` has_value_field: bool, has_unflatten_field: bool, } @@ -282,6 +289,7 @@ impl<'de, 'a, R: BorrowingReader<'de>> de::Deserializer<'de> for &'a mut Deseria fields: &'static [&'static str], visitor: V, ) -> Result { + // Try to go to the next `...` or `` if let Some(e) = self.next_start()? { let name = e.name().to_vec(); self.has_value_field = fields.contains(&INNER_VALUE); From b413971bdfeab10ba39df294e3cf1449ddc68bce Mon Sep 17 00:00:00 2001 From: Mingun Date: Tue, 10 Aug 2021 22:43:55 +0500 Subject: [PATCH 3/7] Fix warning which became a hard error in the newer Rust and unused Result warning --- src/events/attributes.rs | 22 +++++++++++----------- src/se/var.rs | 4 ++-- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/events/attributes.rs b/src/events/attributes.rs index cb4571e4..cc4b1f4c 100644 --- a/src/events/attributes.rs +++ b/src/events/attributes.rs @@ -349,14 +349,14 @@ impl<'a> Iterator for Attributes<'a> { if self.html { attr!($key, 0..0) } else { - return None; - }; + None + } }}; ($key:expr, $val:expr) => { - return Some(Ok(Attribute { + Some(Ok(Attribute { key: &self.bytes[$key], value: Cow::Borrowed(&self.bytes[$val]), - })); + })) }; } @@ -373,7 +373,7 @@ impl<'a> Iterator for Attributes<'a> { .find(|&(_, &b)| !is_whitespace(b)) { Some((i, _)) => i, - None => attr!(self.position..len), + None => return attr!(self.position..len), }; // key ends with either whitespace or = @@ -391,17 +391,17 @@ impl<'a> Iterator for Attributes<'a> { Some((_, &b'=')) => i, Some((j, _)) if self.html => { self.position = j - 1; - attr!(start_key..i, 0..0); + return attr!(start_key..i, 0..0); } Some((j, _)) => err!(Error::NoEqAfterName(j)), None if self.html => { self.position = len; - attr!(start_key..len, 0..0); + return attr!(start_key..len, 0..0); } None => err!(Error::NoEqAfterName(len)), } } - None => attr!(start_key..len), + None => return attr!(start_key..len), }; if self.with_checks { @@ -423,7 +423,7 @@ impl<'a> Iterator for Attributes<'a> { match bytes.by_ref().find(|&(_, &b)| b == *quote) { Some((j, _)) => { self.position = j + 1; - attr!(start_key..end_key, i + 1..j) + return attr!(start_key..end_key, i + 1..j); } None => err!(Error::UnquotedValue(i)), } @@ -434,10 +434,10 @@ impl<'a> Iterator for Attributes<'a> { .find(|&(_, &b)| is_whitespace(b)) .map_or(len, |(j, _)| j); self.position = j; - attr!(start_key..end_key, i..j) + return attr!(start_key..end_key, i..j); } Some((i, _)) => err!(Error::UnquotedValue(i)), - None => attr!(start_key..end_key), + None => return attr!(start_key..end_key), } } } diff --git a/src/se/var.rs b/src/se/var.rs index 93797d42..37c995e3 100644 --- a/src/se/var.rs +++ b/src/se/var.rs @@ -5,7 +5,7 @@ use crate::{ writer::Writer, }; use de::{INNER_VALUE, UNFLATTEN_PREFIX}; -use serde::ser::{self, Serialize, SerializeMap}; +use serde::ser::{self, Serialize}; use serde::Serializer as _; use std::io::Write; @@ -127,7 +127,7 @@ where if key.starts_with(UNFLATTEN_PREFIX) { let key = key.split_at(UNFLATTEN_PREFIX.len()).1; let mut serializer = Serializer::with_root(writer, Some(key)); - serializer.serialize_newtype_struct(key, value); + serializer.serialize_newtype_struct(key, value)?; self.children.append(&mut self.buffer); } else { let mut serializer = Serializer::with_root(writer, Some(key)); From 68079525126d8de0f67f0ad977679cd4abdb5915 Mon Sep 17 00:00:00 2001 From: Mingun Date: Tue, 10 Aug 2021 23:09:53 +0500 Subject: [PATCH 4/7] Fix bad merge of #290 which was introduced in the bad rebase in the 8d3cf19df74f143a15822a5723cb5bd361fb4310 --- src/de/map.rs | 5 ++++- src/se/var.rs | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/de/map.rs b/src/de/map.rs index 31c590bf..ed9673bb 100644 --- a/src/de/map.rs +++ b/src/de/map.rs @@ -1,7 +1,9 @@ //! Serde `Deserializer` module use crate::{ - de::{escape::EscapedDeserializer, BorrowingReader, Deserializer, INNER_VALUE}, + de::{ + escape::EscapedDeserializer, BorrowingReader, Deserializer, INNER_VALUE, UNFLATTEN_PREFIX, + }, errors::serialize::DeError, events::{BytesStart, Event}, }; @@ -64,6 +66,7 @@ impl<'de, 'a, R: BorrowingReader<'de> + 'a> de::MapAccess<'de> for MapAccess<'de ) -> Result, Self::Error> { let decoder = self.de.reader.decoder(); let has_value_field = self.de.has_value_field; + let has_unflatten_field = self.de.has_unflatten_field; if let Some((key, value)) = self.next_attr()? { // try getting map from attributes (key= "value") self.value = MapValue::Attribute { value }; diff --git a/src/se/var.rs b/src/se/var.rs index 37c995e3..1c4e488a 100644 --- a/src/se/var.rs +++ b/src/se/var.rs @@ -1,10 +1,10 @@ use crate::{ + de::{INNER_VALUE, UNFLATTEN_PREFIX}, errors::{serialize::DeError, Error}, events::{BytesEnd, BytesStart, Event}, se::Serializer, writer::Writer, }; -use de::{INNER_VALUE, UNFLATTEN_PREFIX}; use serde::ser::{self, Serialize}; use serde::Serializer as _; use std::io::Write; From ef2973acf594fc1a877e25d45d429f94759921ad Mon Sep 17 00:00:00 2001 From: Mingun Date: Wed, 11 Aug 2021 00:43:01 +0500 Subject: [PATCH 5/7] Fix bad merge from 179f033303f0509c829d3873fc09897383755df7 which broke CI --- .github/workflows/rust.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 2a566f61..2dfba93f 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -15,7 +15,6 @@ jobs: - name: Build run: cargo build - name: Run tests (no features) - run: cargo test run: cargo test --no-default-features - name: Run tests (serialize) run: cargo test --features serialize From c3e1865e3e4ad8136fbb584ad9a14a6b92f18eb2 Mon Sep 17 00:00:00 2001 From: Mingun Date: Wed, 11 Aug 2021 20:24:29 +0500 Subject: [PATCH 6/7] Fix bad merge after 8d3cf19df74f143a15822a5723cb5bd361fb4310 --- tests/xmlrs_reader_tests.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/xmlrs_reader_tests.rs b/tests/xmlrs_reader_tests.rs index 3a0c705b..d396fc09 100644 --- a/tests/xmlrs_reader_tests.rs +++ b/tests/xmlrs_reader_tests.rs @@ -53,8 +53,8 @@ fn sample_2_full() { #[ignore] fn html5() { test( - include_bytes!("documents/html5.html"), - include_bytes!("documents/html5.txt"), + include_str!("documents/html5.html"), + include_str!("documents/html5.txt"), false, ); } @@ -65,8 +65,8 @@ fn html5() { #[ignore] fn html5() { test( - include_bytes!("documents/html5.html"), - include_bytes!("documents/html5-windows.txt"), + include_str!("documents/html5.html"), + include_str!("documents/html5-windows.txt"), false, ); } From 72cf0869f9b0685ce488cd3c22d2b746746a551d Mon Sep 17 00:00:00 2001 From: Mingun Date: Wed, 11 Aug 2021 20:51:40 +0500 Subject: [PATCH 7/7] Run cargo fmt --- src/de/map.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/de/map.rs b/src/de/map.rs index ed9673bb..36826955 100644 --- a/src/de/map.rs +++ b/src/de/map.rs @@ -12,7 +12,9 @@ use serde::de::{self, DeserializeSeed, IntoDeserializer}; enum MapValue { Empty, /// Value should be deserialized from the attribute value - Attribute { value: Vec }, + Attribute { + value: Vec, + }, Nested, /// Value should be deserialized from the text content of the XML node: ///