easyofd_core/doc/
outlines.rs1#[derive(Debug, Clone, Default, PartialEq)]
9pub struct Outlines {
10 pub elements: Vec<CT_OutlineElem>,
12}
13
14#[allow(non_camel_case_types)]
18#[derive(Debug, Clone, PartialEq)]
19pub struct CT_OutlineElem {
20 pub title: String,
22 pub page: Option<u32>,
24 pub children: Vec<CT_OutlineElem>,
26}
27
28impl CT_OutlineElem {
29 #[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 #[must_use]
41 pub fn page(mut self, page: u32) -> Self {
42 self.page = Some(page);
43 self
44 }
45
46 pub fn add_child(&mut self, child: CT_OutlineElem) {
48 self.children.push(child);
49 }
50}
51
52impl Outlines {
53 #[must_use]
55 pub fn new() -> Self {
56 Self::default()
57 }
58
59 pub fn add(&mut self, elem: CT_OutlineElem) {
61 self.elements.push(elem);
62 }
63
64 #[must_use]
66 pub fn len(&self) -> usize {
67 self.elements.len()
68 }
69
70 #[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}