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()
}
);
}