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 Deserializer.into_inner destructor #743

Merged
merged 1 commit into from
May 30, 2024
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ to get an offset of the error position. For `SyntaxError`s the range
it can handle every attribute that does not match existing cases within an enum variant.
- [#722]: Allow to pass owned strings to `Writer::create_element`. This is breaking change!
- [#275]: Added `ElementWriter::new_line()` which enables pretty printing elements with multiple attributes.
- [#743]: Add `Deserializer::get_ref()` to get XML Reader from serde Deserializer

### Bug Fixes

Expand Down Expand Up @@ -83,6 +84,7 @@ to get an offset of the error position. For `SyntaxError`s the range
[#705]: https://github.com/tafia/quick-xml/pull/705
[#722]: https://github.com/tafia/quick-xml/pull/722
[#738]: https://github.com/tafia/quick-xml/pull/738
[#743]: https://github.com/tafia/quick-xml/pull/743
[#748]: https://github.com/tafia/quick-xml/pull/748
[`DeEvent`]: https://docs.rs/quick-xml/latest/quick_xml/de/enum.DeEvent.html
[`PayloadEvent`]: https://docs.rs/quick-xml/latest/quick_xml/de/enum.PayloadEvent.html
Expand Down
101 changes: 101 additions & 0 deletions src/de/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2436,6 +2436,38 @@ where
false
}

/// Returns the underlying XML reader.
///
/// ```
/// # use pretty_assertions::assert_eq;
/// use serde::Deserialize;
/// use quick_xml::de::Deserializer;
/// use quick_xml::Reader;
///
/// #[derive(Deserialize)]
/// struct SomeStruct {
/// field1: String,
/// field2: String,
/// }
///
/// // Try to deserialize from broken XML
/// let mut de = Deserializer::from_str(
/// "<SomeStruct><field1><field2></SomeStruct>"
/// // 0 ^= 28 ^= 41
/// );
///
/// let err = SomeStruct::deserialize(&mut de);
/// assert!(err.is_err());
///
/// let reader: &Reader<_> = de.get_ref().get_ref();
///
/// assert_eq!(reader.error_position(), 28);
/// assert_eq!(reader.buffer_position(), 41);
/// ```
pub fn get_ref(&self) -> &R {
&self.reader.reader
}

/// Set the maximum number of events that could be skipped during deserialization
/// of sequences.
///
Expand Down Expand Up @@ -3065,6 +3097,41 @@ pub struct IoReader<R: BufRead> {
buf: Vec<u8>,
}

impl<R: BufRead> IoReader<R> {
/// Returns the underlying XML reader.
///
/// ```
/// # use pretty_assertions::assert_eq;
/// use serde::Deserialize;
/// use std::io::Cursor;
/// use quick_xml::de::Deserializer;
/// use quick_xml::Reader;
///
/// #[derive(Deserialize)]
/// struct SomeStruct {
/// field1: String,
/// field2: String,
/// }
///
/// // Try to deserialize from broken XML
/// let mut de = Deserializer::from_reader(Cursor::new(
/// "<SomeStruct><field1><field2></SomeStruct>"
/// // 0 ^= 28 ^= 41
/// ));
///
/// let err = SomeStruct::deserialize(&mut de);
/// assert!(err.is_err());
///
/// let reader: &Reader<Cursor<&str>> = de.get_ref().get_ref();
///
/// assert_eq!(reader.error_position(), 28);
/// assert_eq!(reader.buffer_position(), 41);
/// ```
pub fn get_ref(&self) -> &Reader<R> {
&self.reader
}
}

impl<'i, R: BufRead> XmlRead<'i> for IoReader<R> {
fn next(&mut self) -> Result<PayloadEvent<'static>, DeError> {
loop {
Expand Down Expand Up @@ -3098,6 +3165,40 @@ pub struct SliceReader<'de> {
start_trimmer: StartTrimmer,
}

impl<'de> SliceReader<'de> {
/// Returns the underlying XML reader.
///
/// ```
/// # use pretty_assertions::assert_eq;
/// use serde::Deserialize;
/// use quick_xml::de::Deserializer;
/// use quick_xml::Reader;
///
/// #[derive(Deserialize)]
/// struct SomeStruct {
/// field1: String,
/// field2: String,
/// }
///
/// // Try to deserialize from broken XML
/// let mut de = Deserializer::from_str(
/// "<SomeStruct><field1><field2></SomeStruct>"
/// // 0 ^= 28 ^= 41
/// );
///
/// let err = SomeStruct::deserialize(&mut de);
/// assert!(err.is_err());
///
/// let reader: &Reader<&[u8]> = de.get_ref().get_ref();
///
/// assert_eq!(reader.error_position(), 28);
/// assert_eq!(reader.buffer_position(), 41);
/// ```
pub fn get_ref(&self) -> &Reader<&'de [u8]> {
&self.reader
}
}

impl<'de> XmlRead<'de> for SliceReader<'de> {
fn next(&mut self) -> Result<PayloadEvent<'de>, DeError> {
loop {
Expand Down