docx_rust/document/
document.rs

1//! Main Document part
2//!
3//! The corresponding ZIP item is `/word/document.xml`.
4//!
5
6use hard_xml::{XmlRead, XmlResult, XmlWrite, XmlWriter};
7use std::io::Write;
8
9use crate::__xml_test_suites;
10use crate::schema::{SCHEMA_MAIN, SCHEMA_RELATIONSHIPS_DOCUMENT, SCHEMA_WORDML_14, SCHEMA_WP};
11
12use crate::document::{Body, BodyContent};
13
14/// The root element of the main document part.
15#[derive(Debug, Default, XmlRead, Clone)]
16#[cfg_attr(test, derive(PartialEq))]
17#[xml(tag = "w:document")]
18pub struct Document<'a> {
19    /// Specifies the body of the docment.
20    #[xml(child = "w:body")]
21    pub body: Body<'a>,
22}
23
24impl<'a> Document<'a> {
25    pub fn push<T: Into<BodyContent<'a>>>(&mut self, content: T) -> &mut Self {
26        self.body.push(content);
27        self
28    }
29}
30
31impl<'a> XmlWrite for Document<'a> {
32    fn to_writer<W: Write>(&self, writer: &mut XmlWriter<W>) -> XmlResult<()> {
33        let Document { body } = self;
34
35        log::debug!("[Document] Started writing.");
36        let _ = write!(writer.inner, "{}", crate::schema::SCHEMA_XML);
37
38        writer.write_element_start("w:document")?;
39
40        writer.write_attribute("xmlns:w", SCHEMA_MAIN)?;
41
42        writer.write_attribute("xmlns:w14", SCHEMA_WORDML_14)?;
43
44        writer.write_attribute("xmlns:wp", SCHEMA_WP)?;
45
46        writer.write_attribute("xmlns:r", SCHEMA_RELATIONSHIPS_DOCUMENT)?;
47
48        writer.write_element_end_open()?;
49
50        body.to_writer(writer)?;
51
52        writer.write_element_end_close("w:document")?;
53
54        log::debug!("[Document] Finished writing.");
55
56        Ok(())
57    }
58}
59
60__xml_test_suites!(
61    Document,
62    Document::default(),
63    format!(
64        r#"{}<w:document xmlns:w="{}" xmlns:w14="{}" xmlns:wp="{}" xmlns:r="{}"><w:body/></w:document>"#,
65        crate::schema::SCHEMA_XML,
66        SCHEMA_MAIN,
67        SCHEMA_WORDML_14,
68        SCHEMA_WP,
69        SCHEMA_RELATIONSHIPS_DOCUMENT
70    )
71    .as_str(),
72);