diff --git a/src/de/map.rs b/src/de/map.rs index 2c1e8953..25103000 100644 --- a/src/de/map.rs +++ b/src/de/map.rs @@ -273,7 +273,14 @@ where QNameDeserializer::from_attr(QName(&slice[key]), decoder, &mut self.de.key_buf)?; seed.deserialize(de).map(Some) } else { - self.skip_whitespaces()?; + // If we have dedicated "$text" field, whitespace-only text may be significant. + // That also means, that type with `$text` fields behaves as if its element has + // `xml:space="preserve"` attribute: you must not have pretty-print indents + // inside this element. + if !self.has_text_field { + self.skip_whitespaces()?; + } + // try getting from events (value) match self.de.peek()? { // If we have dedicated "$text" field, it will not be passed to "$value" field diff --git a/src/de/mod.rs b/src/de/mod.rs index 7671985b..99dd63fa 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -4641,6 +4641,15 @@ mod tests { assert_eq!(de.next().unwrap(), DeEvent::Eof); } + #[test] + fn space() { + let mut de = make_de(" "); + assert_eq!(de.next().unwrap(), DeEvent::Start(BytesStart::new("tag"))); + assert_eq!(de.next().unwrap(), DeEvent::Text(" ".into())); + assert_eq!(de.next().unwrap(), DeEvent::End(BytesEnd::new("tag"))); + assert_eq!(de.next().unwrap(), DeEvent::Eof); + } + // start::text::text has no difference from start::text #[test] diff --git a/tests/serde-de-seq.rs b/tests/serde-de-seq.rs index d8287ba6..fa63f23c 100644 --- a/tests/serde-de-seq.rs +++ b/tests/serde-de-seq.rs @@ -831,14 +831,7 @@ mod fixed_name { } from_str::( - r#" - - - - text - - - "#, + r#"text"#, ) .unwrap(); } @@ -1688,14 +1681,7 @@ mod fixed_name { } let data: List = from_str( - r#" - - - - text - - - "#, + r#"text"#, ) .unwrap(); @@ -2946,14 +2932,7 @@ mod variable_name { } from_str::( - r#" - - - - text - - - "#, + r#"text"#, ) .unwrap(); } @@ -4015,14 +3994,7 @@ mod variable_name { } let data: List = from_str( - r#" - - - - text - - - "#, + r#"text"#, ) .unwrap(); diff --git a/tests/serde-de.rs b/tests/serde-de.rs index cc82d5f6..da171401 100644 --- a/tests/serde-de.rs +++ b/tests/serde-de.rs @@ -45,12 +45,30 @@ mod text { content: String, } - let item: Item = from_str(r#"content"#).unwrap(); + let item: Item = from_str(r#"content "#).unwrap(); assert_eq!( item, Item { - content: "content".into() + content: "content ".into() + } + ); + } + + #[test] + fn explicit_space() { + #[derive(Debug, Deserialize, PartialEq)] + struct Item { + #[serde(rename = "$text")] + content: String, + } + + let item: Item = from_str(r#" "#).unwrap(); + + assert_eq!( + item, + Item { + content: " ".into() } ); }