docx-rs/docx-core/src/xml_builder/mod.rs

80 lines
2.0 KiB
Rust
Raw Normal View History

2019-11-05 11:03:23 +02:00
#[macro_use]
mod macros;
mod declaration;
mod relationship;
use xml::common::XmlVersion;
2019-11-05 08:10:48 +02:00
use xml::writer::{EmitterConfig, EventWriter, XmlEvent};
pub struct XMLBuilder {
writer: EventWriter<Vec<u8>>,
}
impl XMLBuilder {
pub(crate) fn new() -> XMLBuilder {
let buf = Vec::new();
let writer = EmitterConfig::new()
.write_document_declaration(false)
.perform_indent(true)
.create_writer(buf);
XMLBuilder { writer }
}
2019-11-05 11:03:23 +02:00
// Build types element
// i.e. <Types xmlns="http://...">
2019-11-05 08:10:48 +02:00
pub(crate) fn open_types(mut self, uri: &str) -> Self {
self.writer
.write(XmlEvent::start_element("Types").attr("xmlns", uri))
.expect("should write to buf");
self
}
2019-11-05 11:03:23 +02:00
// Build Override element
// i.e. <Override PartName="/_rels/.rels" ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
2019-11-05 08:10:48 +02:00
pub(crate) fn add_override(mut self, name: &str, content_type: &str) -> Self {
self.writer
.write(
XmlEvent::start_element("Override")
.attr("PartName", &name)
.attr("ContentType", &content_type),
)
.expect("should write to buf");
self.close()
}
2019-11-05 11:03:23 +02:00
// Close tag
2019-11-05 08:10:48 +02:00
pub(crate) fn close(mut self) -> Self {
self.writer
.write(XmlEvent::end_element())
.expect("should end");
self
}
2019-11-05 11:03:23 +02:00
// Write plain text
pub(crate) fn text(mut self, t: &str) -> Self {
self.writer.write(t).unwrap();
self
}
2019-11-05 08:10:48 +02:00
pub(crate) fn build(self) -> Vec<u8> {
self.writer.into_inner()
}
}
2019-11-05 11:03:23 +02:00
#[cfg(test)]
mod tests {
use super::*;
use std::str;
#[test]
fn test_open_types() {
let b = XMLBuilder::new();
let r = b.open_types("http://example").text("child").close().build();
assert_eq!(
str::from_utf8(&r).unwrap(),
r#"<Types xmlns="http://example">child</Types>"#
);
}
}