docx_rs/documents/elements/
text_box_content.rs

1use super::*;
2use serde::ser::{SerializeStruct, Serializer};
3use serde::Serialize;
4use std::io::Write;
5
6use crate::documents::BuildXML;
7use crate::xml_builder::*;
8
9#[derive(Debug, Clone, Serialize, PartialEq, Default)]
10pub struct TextBoxContent {
11    pub children: Vec<TextBoxContentChild>,
12    pub has_numbering: bool,
13}
14
15#[derive(Debug, Clone, PartialEq)]
16pub enum TextBoxContentChild {
17    Paragraph(Box<Paragraph>),
18    Table(Box<Table>),
19}
20
21impl Serialize for TextBoxContentChild {
22    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
23    where
24        S: Serializer,
25    {
26        match *self {
27            TextBoxContentChild::Paragraph(ref p) => {
28                let mut t = serializer.serialize_struct("Paragraph", 2)?;
29                t.serialize_field("type", "paragraph")?;
30                t.serialize_field("data", p)?;
31                t.end()
32            }
33            TextBoxContentChild::Table(ref c) => {
34                let mut t = serializer.serialize_struct("Table", 2)?;
35                t.serialize_field("type", "table")?;
36                t.serialize_field("data", c)?;
37                t.end()
38            }
39        }
40    }
41}
42
43impl TextBoxContent {
44    pub fn new() -> TextBoxContent {
45        Default::default()
46    }
47
48    pub fn add_paragraph(mut self, p: Paragraph) -> Self {
49        if p.has_numbering {
50            self.has_numbering = true
51        }
52        self.children
53            .push(TextBoxContentChild::Paragraph(Box::new(p)));
54        self
55    }
56
57    pub fn add_table(mut self, t: Table) -> Self {
58        if t.has_numbering {
59            self.has_numbering = true
60        }
61        self.children.push(TextBoxContentChild::Table(Box::new(t)));
62        self
63    }
64}
65
66impl BuildXML for TextBoxContentChild {
67    fn build_to<W: Write>(
68        &self,
69        stream: xml::writer::EventWriter<W>,
70    ) -> xml::writer::Result<xml::writer::EventWriter<W>> {
71        match self {
72            TextBoxContentChild::Paragraph(p) => p.build_to(stream),
73            TextBoxContentChild::Table(t) => t.build_to(stream),
74        }
75    }
76}
77
78impl BuildXML for TextBoxContent {
79    fn build_to<W: Write>(
80        &self,
81        stream: xml::writer::EventWriter<W>,
82    ) -> xml::writer::Result<xml::writer::EventWriter<W>> {
83        XMLBuilder::from(stream)
84            .open_text_box_content()?
85            .add_children(&self.children)?
86            .close()?
87            .into_inner()
88    }
89}
90
91#[cfg(test)]
92mod tests {
93
94    use super::*;
95    #[cfg(test)]
96    use pretty_assertions::assert_eq;
97    use std::str;
98
99    #[test]
100    fn test_text_box_content_build() {
101        let b = TextBoxContent::new()
102            .add_paragraph(Paragraph::new())
103            .build();
104        assert_eq!(
105            str::from_utf8(&b).unwrap(),
106            r#"<w:txbxContent><w:p w14:paraId="12345678"><w:pPr><w:rPr /></w:pPr></w:p></w:txbxContent>"#
107        );
108    }
109}