Skip to content

Commit

Permalink
Allow deserialize special field names $value and $text into borro…
Browse files Browse the repository at this point in the history
…wed fields

Because that strings are compiled into binary, they can be referenced by any borrowing struct
  • Loading branch information
Mingun authored and dralley committed Feb 26, 2023
1 parent 05b754b commit 50b7615
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 6 deletions.
4 changes: 4 additions & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
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,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

Expand All @@ -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

Expand Down
13 changes: 9 additions & 4 deletions src/de/map.rs
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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

0 comments on commit 50b7615

Please sign in to comment.