Skip to main content

easyofd_core/doc/
doc_body.rs

1//! 文档体。
2//!
3//! 对应 Java: org.ofdrw.core.basicStructure.ofd.DocBody
4//! OFD.xml 中的 DocBody 元素
5
6use crate::basic_type::ST_Loc;
7
8/// 文档体。
9///
10/// OFD.xml 中的 DocBody 元素,包含文档根节点路径和文档信息。
11///
12/// 对应 Java: org.ofdrw.core.basicStructure.ofd.DocBody
13#[derive(Debug, Clone)]
14pub struct DocBody {
15    /// 文档根节点路径(Doc_0/Document.xml)。
16    pub doc_root: ST_Loc,
17    /// 文档信息(可选)。
18    pub doc_info: Option<String>,
19    /// 签名列表路径(可选)。
20    pub signatures: Option<ST_Loc>,
21}
22
23impl DocBody {
24    /// 创建文档体。
25    #[must_use]
26    pub fn new(doc_root: ST_Loc) -> Self {
27        Self {
28            doc_root,
29            doc_info: None,
30            signatures: None,
31        }
32    }
33
34    /// 设置文档信息。
35    #[must_use]
36    pub fn doc_info(mut self, info: impl Into<String>) -> Self {
37        self.doc_info = Some(info.into());
38        self
39    }
40
41    /// 设置签名列表路径。
42    #[must_use]
43    pub fn signatures(mut self, path: ST_Loc) -> Self {
44        self.signatures = Some(path);
45        self
46    }
47
48    /// 获取文档根节点路径。
49    #[must_use]
50    pub fn doc_root(&self) -> &ST_Loc {
51        &self.doc_root
52    }
53}
54
55#[cfg(test)]
56mod tests {
57    use super::*;
58
59    #[test]
60    fn doc_body_new() {
61        let db = DocBody::new(ST_Loc::new("Doc_0/Document.xml"));
62        assert_eq!(db.doc_root.loc(), "Doc_0/Document.xml");
63        assert!(db.doc_info.is_none());
64        assert!(db.signatures.is_none());
65    }
66
67    #[test]
68    fn doc_body_builder() {
69        let db = DocBody::new(ST_Loc::new("Doc_0/Document.xml"))
70            .doc_info("test info")
71            .signatures(ST_Loc::new("Doc_0/Signs/Signatures.xml"));
72        assert!(db.doc_info.is_some());
73        assert!(db.signatures.is_some());
74    }
75
76    #[test]
77    fn doc_body_clone_debug() {
78        let db = DocBody::new(ST_Loc::new("Doc_0/Document.xml"));
79        let db2 = db.clone();
80        assert_eq!(db2.doc_root.loc(), "Doc_0/Document.xml");
81        assert!(format!("{db:?}").contains("DocBody"));
82    }
83}