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