docx_rs/documents/elements/
delete_text.rs1use 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"><div /></w:delText>"#
65 );
66 }
67}