xlsbye-xml 0.1.0

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

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

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

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

    writer.write_start_element("sheetViews", std::iter::empty::<(&str, &str)>())?;
    writer.write_empty_element("sheetView", [("workbookViewId", "0")])?;
    writer.write_end_element("sheetViews")?;

    if let Some(rel_id) = chartsheet.drawing_rel_id.as_deref() {
        writer.write_empty_element("drawing", [("r:id", rel_id)])?;
    }

    writer.write_end_element("chartsheet")
}

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

    #[test]
    fn writes_chartsheet_xml() {
        let parsed = ParsedChartsheet {
            drawing_rel_id: Some("rId1".to_string()),
        };

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

        assert!(xml.contains("<chartsheet "));
        assert!(xml.contains("<sheetView workbookViewId=\"0\"/>"));
        assert!(xml.contains("<drawing r:id=\"rId1\"/>"));
    }
}