docx_rs/documents/elements/
text.rs1use 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}