vault_tasks_core/
vault_data.rs

1use std::fmt::Display;
2
3use super::task::Task;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub enum VaultData {
7    /// Name, Content
8    Directory(String, Vec<VaultData>),
9    /// Name, Content
10    Header(usize, String, Vec<VaultData>),
11    /// Task, Subtasks
12    Task(Task),
13}
14
15impl Display for VaultData {
16    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17        fn write_indent(indent_length: usize, f: &mut std::fmt::Formatter) -> std::fmt::Result {
18            (1..=indent_length).try_for_each(|_| write!(f, "\t"))?;
19            Ok(())
20        }
21        fn write_underline_with_indent(
22            text: &str,
23            indent_length: usize,
24            f: &mut std::fmt::Formatter,
25        ) -> std::fmt::Result {
26            write_indent(indent_length, f)?;
27            writeln!(f, "{text}")?;
28            write_indent(indent_length, f)?;
29            for _i in 0..(text.len()) {
30                write!(f, "‾")?;
31            }
32            writeln!(f)?;
33            Ok(())
34        }
35        fn fmt_aux(
36            file_entry: &VaultData,
37            f: &mut std::fmt::Formatter,
38            depth: usize,
39        ) -> std::fmt::Result {
40            match file_entry {
41                VaultData::Header(_, header, entries) => {
42                    write_underline_with_indent(&header.to_string(), depth, f)?;
43                    for entry in entries {
44                        fmt_aux(entry, f, depth + 1)?;
45                    }
46                }
47                VaultData::Directory(name, entries) => {
48                    write_underline_with_indent(&name.to_string(), depth, f)?;
49                    for entry in entries {
50                        fmt_aux(entry, f, depth + 1)?;
51                    }
52                }
53                VaultData::Task(task) => {
54                    for line in task.to_string().split('\n') {
55                        write_indent(depth, f)?;
56                        writeln!(f, "{line}")?;
57                    }
58
59                    for subtask in &task.subtasks {
60                        for line in VaultData::Task(subtask.clone()).to_string().split('\n') {
61                            write_indent(depth + 1, f)?;
62                            writeln!(f, "{line}")?;
63                        }
64                    }
65                }
66            }
67            Ok(())
68        }
69        fmt_aux(self, f, 0)
70    }
71}