docx_rs/documents/elements/
text.rs

1use serde::ser::{Serialize, SerializeStruct, Serializer};
2use serde::Deserialize;
3use std::io::Write;
4
5use crate::documents::BuildXML;
6use crate::escape::escape;
7use crate::xml_builder::*;
8
9#[derive(Debug, Clone, Deserialize, PartialEq)]
10#[serde(rename_all = "camelCase")]
11pub struct Text {
12    pub text: String,
13    pub preserve_space: bool,
14}
15
16impl Text {
17    pub fn new(text: impl Into<String>) -> Text {
18        Text {
19            text: escape(&text.into()),
20            preserve_space: true,
21        }
22    }
23
24    pub(crate) fn without_escape(text: impl Into<String>) -> Text {
25        Text {
26            text: text.into(),
27            preserve_space: true,
28        }
29    }
30}
31
32impl BuildXML for Text {
33    fn build_to<W: Write>(
34        &self,
35        stream: xml::writer::EventWriter<W>,
36    ) -> xml::writer::Result<xml::writer::EventWriter<W>> {
37        XMLBuilder::from(stream)
38            .text(&self.text, true)?
39            .into_inner()
40    }
41}
42
43impl Serialize for Text {
44    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
45    where
46        S: Serializer,
47    {
48        let mut t = serializer.serialize_struct("Text", 2)?;
49        t.serialize_field("preserveSpace", &self.preserve_space)?;
50        t.serialize_field("text", &self.text)?;
51        t.end()
52    }
53}
54
55#[cfg(test)]
56mod tests {
57
58    use super::*;
59    #[cfg(test)]
60    use pretty_assertions::assert_eq;
61    use std::str;
62
63    #[test]
64    fn test_build() {
65        let b = Text::new("Hello").build();
66        assert_eq!(
67            str::from_utf8(&b).unwrap(),
68            r#"<w:t xml:space="preserve">Hello</w:t>"#
69        );
70    }
71
72    #[test]
73    fn test_json() {
74        let t = Text::new("Hello");
75        assert_eq!(
76            serde_json::to_string(&t).unwrap(),
77            r#"{"preserveSpace":true,"text":"Hello"}"#
78        );
79    }
80}