ent_tree/
ui.rs

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}