2019-11-05 11:03:23 +02:00
|
|
|
#[macro_use]
|
|
|
|
mod macros;
|
|
|
|
mod declaration;
|
2019-11-05 12:20:40 +02:00
|
|
|
mod properties;
|
2019-11-05 11:03:23 +02:00
|
|
|
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>"#
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|