xlsbye-xml 0.1.0

SpreadsheetML XML writer for xlsbye
Documentation
use std::io::Write;

use xlsbye_core::types::ParsedExternalLink;
use xlsbye_core::xml_names::{RELATIONSHIPS_NS, SPREADSHEET_NS};

use crate::writer::{Result, XmlWriter};

pub fn write_external_link(writer: impl Write, link: &ParsedExternalLink) -> Result<()> {
    let mut writer = XmlWriter::new(writer);
    writer.write_xml_declaration()?;
    writer.write_start_element_with_ns(
        "externalLink",
        [("", SPREADSHEET_NS), ("r", RELATIONSHIPS_NS)],
        std::iter::empty::<(&str, &str)>(),
    )?;

    let rel_id = link.rel_id.as_deref().unwrap_or("rId1");
    writer.write_start_element("externalBook", [("r:id", rel_id)])?;

    if !link.sheet_names.is_empty() {
        writer.write_start_element("sheetNames", std::iter::empty::<(&str, &str)>())?;
        for sheet_name in &link.sheet_names {
            writer.write_empty_element("sheetName", [("val", sheet_name.as_str())])?;
        }
        writer.write_end_element("sheetNames")?;
    }

    writer.write_end_element("externalBook")?;
    writer.write_end_element("externalLink")
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn writes_external_link_xml() {
        let parsed = ParsedExternalLink {
            rel_id: Some("rId9".to_string()),
            sheet_names: vec!["Sheet1".to_string(), "Sheet Two".to_string()],
        };

        let mut out = Vec::new();
        write_external_link(&mut out, &parsed).expect("external link xml should be written");
        let xml = String::from_utf8(out).expect("utf-8 xml");

        assert!(xml.contains("<externalLink "));
        assert!(xml.contains("<externalBook r:id=\"rId9\">"));
        assert!(xml.contains("<sheetName val=\"Sheet1\"/>"));
        assert!(xml.contains("<sheetName val=\"Sheet Two\"/>"));
    }
}