1use std::path::Path;
2use colored::Colorize;
3use crate::fs::{is_hidden, TreeEntry};
4
5
6pub fn print_tree_root(entry: &TreeEntry) {
7 let name_str = format_entry(entry, false);
8 println!("{}", name_str);
9 if let Some(children) = &entry.children {
10 let len = children.len();
11 for (i, child) in children.iter().enumerate() {
12 let hidden = is_hidden(Path::new(child.name.as_str()));
13 print_tree(child, "", i == len - 1, hidden);
14 }
15 }
16}
17
18fn print_tree(entry: &TreeEntry, prefix: &str, is_last: bool, hidden: bool) {
19 let connector = if is_last { "└── " } else { "├── " };
20 let entry_str = format_entry(entry, hidden);
21 println!("{}{}{}", prefix, connector, entry_str);
22
23 if let Some(children) = &entry.children {
24 let new_prefix = if is_last {
25 format!("{} ", prefix)
26 } else {
27 format!("{}│ ", prefix)
28 };
29 let len = children.len();
30 for (i, child) in children.iter().enumerate() {
31 let hidden = is_hidden(Path::new(child.name.as_str())) || hidden;
32 print_tree(child, &new_prefix, i == len - 1, hidden);
33 }
34 }
35}
36
37fn format_entry(entry: &TreeEntry, hidden: bool) -> String {
38 if entry.is_dir {
39 let name_str = format!("{}{}", " ".cyan(), entry.name.cyan());
40 if hidden {
41 return format!("{}{}", name_str.dimmed(),"/".cyan().dimmed());
42 }
43 return format!("{}{}", name_str.bold() ,"/".cyan().bold());
44 }
45 if hidden {
46 return format!("{}{}", " ".dimmed(), entry.name.dimmed());
47 }
48 format!("{}{}", " ".bold(), entry.name.bold())
49}