vault_tasks_core/
vault_data.rs1use std::fmt::Display;
2
3use super::task::Task;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
6pub enum VaultData {
7 Directory(String, Vec<VaultData>),
9 Header(usize, String, Vec<VaultData>),
11 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}