Skip to main content

easyofd_core/
integrity.rs

1//! OFD 条目列表。
2//!
3//! 对应 Java: org.ofdrw.core.integrity.OFDEntries
4
5/// OFD 条目列表。
6///
7/// 用于 OFD 文件完整性保护,记录所有文件的摘要信息。
8///
9/// 对应 Java: org.ofdrw.core.integrity.OFDEntries
10#[derive(Debug, Clone, Default)]
11pub struct OFDEntries {
12    /// 条目列表(路径, 摘要值)。
13    pub entries: Vec<(String, String)>,
14}
15
16impl OFDEntries {
17    /// 创建空条目列表。
18    #[must_use]
19    pub fn new() -> Self {
20        Self::default()
21    }
22
23    /// 添加条目。
24    pub fn add(&mut self, path: impl Into<String>, digest: impl Into<String>) {
25        self.entries.push((path.into(), digest.into()));
26    }
27
28    /// 获取条目数量。
29    #[must_use]
30    pub fn len(&self) -> usize {
31        self.entries.len()
32    }
33
34    /// 是否为空。
35    #[must_use]
36    pub fn is_empty(&self) -> bool {
37        self.entries.is_empty()
38    }
39
40    /// 查找指定路径的摘要。
41    #[must_use]
42    pub fn find(&self, path: &str) -> Option<&str> {
43        self.entries
44            .iter()
45            .find(|(p, _)| p == path)
46            .map(|(_, d)| d.as_str())
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use super::*;
53
54    #[test]
55    fn ofd_entries_new() {
56        let e = OFDEntries::new();
57        assert!(e.is_empty());
58    }
59
60    #[test]
61    fn ofd_entries_add() {
62        let mut e = OFDEntries::new();
63        e.add("OFD.xml", "abc123");
64        e.add("Doc_0/Document.xml", "def456");
65        assert_eq!(e.len(), 2);
66    }
67
68    #[test]
69    fn ofd_entries_find() {
70        let mut e = OFDEntries::new();
71        e.add("OFD.xml", "hash1");
72        assert_eq!(e.find("OFD.xml"), Some("hash1"));
73        assert_eq!(e.find("missing"), None);
74    }
75}