From 68565498c52ee5465bbd7959f608e8005e7316a9 Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 26 Feb 2023 22:47:43 +0500 Subject: [PATCH 1/2] Allow deserialize special field names `$value` and `$text` into borrowed fields Because that strings are compiled into binary, they can be referenced by any borrowing struct --- Changelog.md | 4 ++++ src/de/map.rs | 13 +++++++++---- src/de/var.rs | 4 ++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/Changelog.md b/Changelog.md index 8324d3f8..96f7a8cb 100644 --- a/Changelog.md +++ b/Changelog.md @@ -18,6 +18,8 @@ - [#556]: Add new `to_writer_with_root` and `to_string_with_root` helper functions - [#520]: Add methods `BytesText::inplace_trim_start` and `BytesText::inplace_trim_end` to trim leading and trailing spaces from text events +- [#565]: Allow deserialize special field names `$value` and `$text` into borrowed + fields when use serde deserializer ### Bug Fixes @@ -33,6 +35,7 @@ The same behavior for the `Reader` does not implemented (yet?) and should be implemented manually - [#562]: Correctly set minimum required version of memchr dependency to 2.1 +- [#565]: Fix compilation error when build with serde <1.0.139 ### Misc Changes @@ -45,6 +48,7 @@ [#541]: https://github.com/tafia/quick-xml/pull/541 [#556]: https://github.com/tafia/quick-xml/pull/556 [#562]: https://github.com/tafia/quick-xml/pull/562 +[#565]: https://github.com/tafia/quick-xml/pull/565 ## 0.27.1 -- 2022-12-28 diff --git a/src/de/map.rs b/src/de/map.rs index 28fbbc79..7feef941 100644 --- a/src/de/map.rs +++ b/src/de/map.rs @@ -10,7 +10,8 @@ use crate::{ events::BytesStart, name::QName, }; -use serde::de::{self, DeserializeSeed, IntoDeserializer, SeqAccess, Visitor}; +use serde::de::value::BorrowedStrDeserializer; +use serde::de::{self, DeserializeSeed, SeqAccess, Visitor}; use serde::serde_if_integer128; use std::borrow::Cow; use std::ops::Range; @@ -244,14 +245,16 @@ where // Deserialize `key` from special attribute name which means // that value should be taken from the text content of the // XML node - seed.deserialize(VALUE_KEY.into_deserializer()).map(Some) + let de = BorrowedStrDeserializer::::new(VALUE_KEY); + seed.deserialize(de).map(Some) } DeEvent::Text(_) => { self.source = ValueSource::Text; // Deserialize `key` from special attribute name which means // that value should be taken from the text content of the // XML node - seed.deserialize(TEXT_KEY.into_deserializer()).map(Some) + let de = BorrowedStrDeserializer::::new(TEXT_KEY); + seed.deserialize(de).map(Some) } // Used to deserialize collections of enums, like: // @@ -271,7 +274,9 @@ where // See https://github.com/serde-rs/serde/issues/1905 DeEvent::Start(e) if self.has_value_field && not_in(self.fields, e, decoder)? => { self.source = ValueSource::Content; - seed.deserialize(VALUE_KEY.into_deserializer()).map(Some) + + let de = BorrowedStrDeserializer::::new(VALUE_KEY); + seed.deserialize(de).map(Some) } DeEvent::Start(e) => { self.source = ValueSource::Nested; diff --git a/src/de/var.rs b/src/de/var.rs index b5403e06..3e200904 100644 --- a/src/de/var.rs +++ b/src/de/var.rs @@ -4,7 +4,7 @@ use crate::{ de::{DeEvent, Deserializer, XmlRead, TEXT_KEY}, errors::serialize::DeError, }; -use serde::de::value::StrDeserializer; +use serde::de::value::BorrowedStrDeserializer; use serde::de::{self, DeserializeSeed, Deserializer as _, Visitor}; /// An enum access @@ -42,7 +42,7 @@ where false, ), DeEvent::Text(_) => ( - seed.deserialize(StrDeserializer::::new(TEXT_KEY))?, + seed.deserialize(BorrowedStrDeserializer::::new(TEXT_KEY))?, true, ), DeEvent::End(e) => return Err(DeError::UnexpectedEnd(e.name().into_inner().to_vec())), From 04cc7906bca3b3bf9319f69c4bbf5dbd28eefc8c Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 26 Feb 2023 22:31:12 +0500 Subject: [PATCH 2/2] Add workflow to check for minimal versions --- .github/workflows/rust.yml | 17 +++++++++++++++++ Cargo.toml | 6 ++++-- Changelog.md | 1 + 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 4d96b9a8..43a257f7 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -17,6 +17,23 @@ jobs: - uses: dtolnay/rust-toolchain@1.52.0 - run: cargo check + minimal-versions: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install tools + run: cargo install cargo-hack cargo-minimal-versions + - name: Install nightly rust + uses: dtolnay/rust-toolchain@nightly + - name: Check with minimal versions + run: cargo minimal-versions check + - name: Check with minimal versions (serialize) + run: cargo minimal-versions check --features serialize + - name: Check with minimal versions (encoding) + run: cargo minimal-versions check --features encoding + - name: Check with minimal versions (async-tokio) + run: cargo minimal-versions check --features async-tokio + test: strategy: matrix: diff --git a/Cargo.toml b/Cargo.toml index a9a70058..61157326 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,14 +17,16 @@ include = ["src/*", "LICENSE-MIT.md", "README.md"] document-features = { version = "0.2", optional = true } encoding_rs = { version = "0.8", optional = true } serde = { version = "1.0.100", optional = true } -tokio = { version = "1.0", optional = true, default-features = false, features = ["io-util"] } +tokio = { version = "1.10", optional = true, default-features = false, features = ["io-util"] } memchr = "2.1" [dev-dependencies] criterion = "0.4" pretty_assertions = "1.3" regex = "1" -serde = { version = "1.0", features = ["derive"] } +# #[serde(other)] allowed not only inside field_identifier since 1.0.79 +# serde does not follow semver in numbering and their dependencies, so we specifying patch here +serde_derive = { version = "1.0.79" } serde-value = "0.7" tokio = { version = "1.21", default-features = false, features = ["macros", "rt"] } tokio-test = "0.4" diff --git a/Changelog.md b/Changelog.md index 96f7a8cb..26446ea0 100644 --- a/Changelog.md +++ b/Changelog.md @@ -35,6 +35,7 @@ The same behavior for the `Reader` does not implemented (yet?) and should be implemented manually - [#562]: Correctly set minimum required version of memchr dependency to 2.1 +- [#565]: Correctly set minimum required version of tokio dependency to 1.10 - [#565]: Fix compilation error when build with serde <1.0.139 ### Misc Changes