docx_rs/documents/elements/
delete_text.rs

1use serde::{Deserialize, Serialize};
2use std::io::Write;
3
4use crate::documents::BuildXML;
5use crate::escape::escape;
6use crate::xml_builder::*;
7
8#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
9#[serde(rename_all = "camelCase")]
10pub struct DeleteText {
11    text: String,
12    preserve_space: bool,
13}
14
15impl DeleteText {
16    pub fn new(text: impl Into<String>) -> DeleteText {
17        DeleteText {
18            text: escape(&text.into()),
19            preserve_space: true,
20        }
21    }
22
23    pub(crate) fn without_escape(text: impl Into<String>) -> DeleteText {
24        DeleteText {
25            text: text.into(),
26            preserve_space: true,
27        }
28    }
29}
30
31impl BuildXML for DeleteText {
32    fn build_to<W: Write>(
33        &self,
34        stream: xml::writer::EventWriter<W>,
35    ) -> xml::writer::Result<xml::writer::EventWriter<W>> {
36        XMLBuilder::from(stream)
37            .delete_text(&self.text, true)?
38            .into_inner()
39    }
40}
41
42#[cfg(test)]
43mod tests {
44
45    use super::*;
46    #[cfg(test)]
47    use pretty_assertions::assert_eq;
48    use std::str;
49
50    #[test]
51    fn test_build() {
52        let b = DeleteText::new("Hello").build();
53        assert_eq!(
54            str::from_utf8(&b).unwrap(),
55            r#"<w:delText xml:space="preserve">Hello</w:delText>"#
56        );
57    }
58
59    #[test]
60    fn test_escape() {
61        let b = DeleteText::new("<div />").build();
62        assert_eq!(
63            str::from_utf8(&b).unwrap(),
64            r#"<w:delText xml:space="preserve">&lt;div /&gt;</w:delText>"#
65        );
66    }
67}