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\"/>"));
}
}