Skip to content

Commit 42a91c9

Browse files
authored
Merge pull request #743 from dishmaker/dishmaker/into_inner
Add `Deserializer::get_ref()` accessor
2 parents 1916042 + e031a6b commit 42a91c9

File tree

2 files changed

+103
-0
lines changed

2 files changed

+103
-0
lines changed

Changelog.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ to get an offset of the error position. For `SyntaxError`s the range
3434
it can handle every attribute that does not match existing cases within an enum variant.
3535
- [#722]: Allow to pass owned strings to `Writer::create_element`. This is breaking change!
3636
- [#275]: Added `ElementWriter::new_line()` which enables pretty printing elements with multiple attributes.
37+
- [#743]: Add `Deserializer::get_ref()` to get XML Reader from serde Deserializer
3738

3839
### Bug Fixes
3940

@@ -83,6 +84,7 @@ to get an offset of the error position. For `SyntaxError`s the range
8384
[#705]: https://github.com/tafia/quick-xml/pull/705
8485
[#722]: https://github.com/tafia/quick-xml/pull/722
8586
[#738]: https://github.com/tafia/quick-xml/pull/738
87+
[#743]: https://github.com/tafia/quick-xml/pull/743
8688
[#748]: https://github.com/tafia/quick-xml/pull/748
8789
[`DeEvent`]: https://docs.rs/quick-xml/latest/quick_xml/de/enum.DeEvent.html
8890
[`PayloadEvent`]: https://docs.rs/quick-xml/latest/quick_xml/de/enum.PayloadEvent.html

src/de/mod.rs

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2436,6 +2436,38 @@ where
24362436
false
24372437
}
24382438

2439+
/// Returns the underlying XML reader.
2440+
///
2441+
/// ```
2442+
/// # use pretty_assertions::assert_eq;
2443+
/// use serde::Deserialize;
2444+
/// use quick_xml::de::Deserializer;
2445+
/// use quick_xml::Reader;
2446+
///
2447+
/// #[derive(Deserialize)]
2448+
/// struct SomeStruct {
2449+
/// field1: String,
2450+
/// field2: String,
2451+
/// }
2452+
///
2453+
/// // Try to deserialize from broken XML
2454+
/// let mut de = Deserializer::from_str(
2455+
/// "<SomeStruct><field1><field2></SomeStruct>"
2456+
/// // 0 ^= 28 ^= 41
2457+
/// );
2458+
///
2459+
/// let err = SomeStruct::deserialize(&mut de);
2460+
/// assert!(err.is_err());
2461+
///
2462+
/// let reader: &Reader<_> = de.get_ref().get_ref();
2463+
///
2464+
/// assert_eq!(reader.error_position(), 28);
2465+
/// assert_eq!(reader.buffer_position(), 41);
2466+
/// ```
2467+
pub fn get_ref(&self) -> &R {
2468+
&self.reader.reader
2469+
}
2470+
24392471
/// Set the maximum number of events that could be skipped during deserialization
24402472
/// of sequences.
24412473
///
@@ -3065,6 +3097,41 @@ pub struct IoReader<R: BufRead> {
30653097
buf: Vec<u8>,
30663098
}
30673099

3100+
impl<R: BufRead> IoReader<R> {
3101+
/// Returns the underlying XML reader.
3102+
///
3103+
/// ```
3104+
/// # use pretty_assertions::assert_eq;
3105+
/// use serde::Deserialize;
3106+
/// use std::io::Cursor;
3107+
/// use quick_xml::de::Deserializer;
3108+
/// use quick_xml::Reader;
3109+
///
3110+
/// #[derive(Deserialize)]
3111+
/// struct SomeStruct {
3112+
/// field1: String,
3113+
/// field2: String,
3114+
/// }
3115+
///
3116+
/// // Try to deserialize from broken XML
3117+
/// let mut de = Deserializer::from_reader(Cursor::new(
3118+
/// "<SomeStruct><field1><field2></SomeStruct>"
3119+
/// // 0 ^= 28 ^= 41
3120+
/// ));
3121+
///
3122+
/// let err = SomeStruct::deserialize(&mut de);
3123+
/// assert!(err.is_err());
3124+
///
3125+
/// let reader: &Reader<Cursor<&str>> = de.get_ref().get_ref();
3126+
///
3127+
/// assert_eq!(reader.error_position(), 28);
3128+
/// assert_eq!(reader.buffer_position(), 41);
3129+
/// ```
3130+
pub fn get_ref(&self) -> &Reader<R> {
3131+
&self.reader
3132+
}
3133+
}
3134+
30683135
impl<'i, R: BufRead> XmlRead<'i> for IoReader<R> {
30693136
fn next(&mut self) -> Result<PayloadEvent<'static>, DeError> {
30703137
loop {
@@ -3098,6 +3165,40 @@ pub struct SliceReader<'de> {
30983165
start_trimmer: StartTrimmer,
30993166
}
31003167

3168+
impl<'de> SliceReader<'de> {
3169+
/// Returns the underlying XML reader.
3170+
///
3171+
/// ```
3172+
/// # use pretty_assertions::assert_eq;
3173+
/// use serde::Deserialize;
3174+
/// use quick_xml::de::Deserializer;
3175+
/// use quick_xml::Reader;
3176+
///
3177+
/// #[derive(Deserialize)]
3178+
/// struct SomeStruct {
3179+
/// field1: String,
3180+
/// field2: String,
3181+
/// }
3182+
///
3183+
/// // Try to deserialize from broken XML
3184+
/// let mut de = Deserializer::from_str(
3185+
/// "<SomeStruct><field1><field2></SomeStruct>"
3186+
/// // 0 ^= 28 ^= 41
3187+
/// );
3188+
///
3189+
/// let err = SomeStruct::deserialize(&mut de);
3190+
/// assert!(err.is_err());
3191+
///
3192+
/// let reader: &Reader<&[u8]> = de.get_ref().get_ref();
3193+
///
3194+
/// assert_eq!(reader.error_position(), 28);
3195+
/// assert_eq!(reader.buffer_position(), 41);
3196+
/// ```
3197+
pub fn get_ref(&self) -> &Reader<&'de [u8]> {
3198+
&self.reader
3199+
}
3200+
}
3201+
31013202
impl<'de> XmlRead<'de> for SliceReader<'de> {
31023203
fn next(&mut self) -> Result<PayloadEvent<'de>, DeError> {
31033204
loop {

0 commit comments

Comments
 (0)