Skip to main content

easyofd_core/doc/
outlines.rs

1//! 大纲树。
2//!
3//! 对应 Java: org.ofdrw.core.basicStructure.outlines.Outlines
4
5/// 大纲树。
6///
7/// 对应 Java: org.ofdrw.core.basicStructure.outlines.Outlines
8#[derive(Debug, Clone, Default, PartialEq)]
9pub struct Outlines {
10    /// 大纲元素列表。
11    pub elements: Vec<CT_OutlineElem>,
12}
13
14/// 大纲元素。
15///
16/// 对应 Java: org.ofdrw.core.basicStructure.outlines.CT_OutlineElem
17#[allow(non_camel_case_types)]
18#[derive(Debug, Clone, PartialEq)]
19pub struct CT_OutlineElem {
20    /// 标题。
21    pub title: String,
22    /// 目标页码(可选)。
23    pub page: Option<u32>,
24    /// 子大纲元素。
25    pub children: Vec<CT_OutlineElem>,
26}
27
28impl CT_OutlineElem {
29    /// 创建大纲元素。
30    #[must_use]
31    pub fn new(title: impl Into<String>) -> Self {
32        Self {
33            title: title.into(),
34            page: None,
35            children: Vec::new(),
36        }
37    }
38
39    /// 设置目标页码。
40    #[must_use]
41    pub fn page(mut self, page: u32) -> Self {
42        self.page = Some(page);
43        self
44    }
45
46    /// 添加子元素。
47    pub fn add_child(&mut self, child: CT_OutlineElem) {
48        self.children.push(child);
49    }
50}
51
52impl Outlines {
53    /// 创建空大纲。
54    #[must_use]
55    pub fn new() -> Self {
56        Self::default()
57    }
58
59    /// 添加大纲元素。
60    pub fn add(&mut self, elem: CT_OutlineElem) {
61        self.elements.push(elem);
62    }
63
64    /// 获取元素数量。
65    #[must_use]
66    pub fn len(&self) -> usize {
67        self.elements.len()
68    }
69
70    /// 是否为空。
71    #[must_use]
72    pub fn is_empty(&self) -> bool {
73        self.elements.is_empty()
74    }
75}
76
77#[cfg(test)]
78mod tests {
79    use super::*;
80
81    #[test]
82    fn outlines_new() {
83        let o = Outlines::new();
84        assert!(o.is_empty());
85    }
86
87    #[test]
88    fn outlines_add() {
89        let mut o = Outlines::new();
90        o.add(CT_OutlineElem::new("Chapter 1").page(1));
91        o.add(CT_OutlineElem::new("Chapter 2").page(5));
92        assert_eq!(o.len(), 2);
93    }
94
95    #[test]
96    fn outline_elem_children() {
97        let mut root = CT_OutlineElem::new("Root");
98        root.add_child(CT_OutlineElem::new("Child 1"));
99        root.add_child(CT_OutlineElem::new("Child 2"));
100        assert_eq!(root.children.len(), 2);
101    }
102
103    #[test]
104    fn outline_elem_page() {
105        let elem = CT_OutlineElem::new("Test").page(10);
106        assert_eq!(elem.page, Some(10));
107    }
108}