use std::fmt::Write;
#[derive(Debug, Clone)]
pub struct Reference {
pub file_ref: String,
pub check_value: String,
}
impl Reference {
#[must_use]
pub fn new(file_ref: impl Into<String>, check_value: impl Into<String>) -> Self {
Self {
file_ref: file_ref.into(),
check_value: check_value.into(),
}
}
#[must_use]
pub fn to_xml_string(&self) -> String {
let mut xml = String::from(r#"<ofd:Reference FileRef=""#);
let _ = write!(xml, "{}", self.file_ref);
xml.push_str(r#"">"#);
let _ = write!(xml, "<ofd:CheckValue>{}</ofd:CheckValue>", self.check_value);
xml.push_str("</ofd:Reference>");
xml
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_reference_new() {
let r = Reference::new("/Doc_0/Document.xml", "abc123base64");
assert_eq!(r.file_ref, "/Doc_0/Document.xml");
assert_eq!(r.check_value, "abc123base64");
}
#[test]
fn test_reference_xml() {
let r = Reference::new("/Doc_0/Pages/Page_0/Content.xml", "dGVzdA==");
let xml = r.to_xml_string();
assert!(xml.contains(r#"FileRef="/Doc_0/Pages/Page_0/Content.xml""#));
assert!(xml.contains("<ofd:CheckValue>dGVzdA==</ofd:CheckValue>"));
assert!(xml.contains("</ofd:Reference>"));
}
#[test]
fn test_reference_clone() {
let r = Reference::new("/Res/font.ttf", "hash123");
let r2 = r.clone();
assert_eq!(r2.file_ref, "/Res/font.ttf");
assert_eq!(r2.check_value, "hash123");
}
}