Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add check for minimal versions and fix compilation + more borrow #565

Merged
merged 2 commits into from Feb 26, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
17 changes: 17 additions & 0 deletions .github/workflows/rust.yml
Expand Up @@ -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:
Expand Down
6 changes: 4 additions & 2 deletions Cargo.toml
Expand Up @@ -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"
Expand Down
5 changes: 5 additions & 0 deletions Changelog.md
Expand Up @@ -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

Expand All @@ -33,6 +35,8 @@
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

Expand All @@ -45,6 +49,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

Expand Down
13 changes: 9 additions & 4 deletions src/de/map.rs
Expand Up @@ -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;
Expand Down Expand Up @@ -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::<DeError>::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::<DeError>::new(TEXT_KEY);
seed.deserialize(de).map(Some)
}
// Used to deserialize collections of enums, like:
// <root>
Expand All @@ -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::<DeError>::new(VALUE_KEY);
seed.deserialize(de).map(Some)
}
DeEvent::Start(e) => {
self.source = ValueSource::Nested;
Expand Down
4 changes: 2 additions & 2 deletions src/de/var.rs
Expand Up @@ -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
Expand Down Expand Up @@ -42,7 +42,7 @@ where
false,
),
DeEvent::Text(_) => (
seed.deserialize(StrDeserializer::<DeError>::new(TEXT_KEY))?,
seed.deserialize(BorrowedStrDeserializer::<DeError>::new(TEXT_KEY))?,
true,
),
DeEvent::End(e) => return Err(DeError::UnexpectedEnd(e.name().into_inner().to_vec())),
Expand Down