ent-tree 0.1.2

tree but better
Documentation
use std::path::Path;
use colored::Colorize;
use crate::fs::{is_hidden, TreeEntry};


pub fn print_tree_root(entry: &TreeEntry) {
    let name_str = format_entry(entry, false);
    println!("{}", name_str);
    if let Some(children) = &entry.children {
        let len = children.len();
        for (i, child) in children.iter().enumerate() {
            let hidden = is_hidden(Path::new(child.name.as_str()));
            print_tree(child, "", i == len - 1, hidden);
        }
    }
}

fn print_tree(entry: &TreeEntry, prefix: &str, is_last: bool, hidden: bool) {
    let connector = if is_last { "└── " } else { "├── " };
    let entry_str = format_entry(entry, hidden);
    println!("{}{}{}", prefix, connector, entry_str);

    if let Some(children) = &entry.children {
        let new_prefix = if is_last {
            format!("{}    ", prefix)
        } else {
            format!("{}", prefix)
        };
        let len = children.len();
        for (i, child) in children.iter().enumerate() {
            let hidden = is_hidden(Path::new(child.name.as_str())) || hidden;
            print_tree(child, &new_prefix, i == len - 1, hidden);
        }
    }
}

fn format_entry(entry: &TreeEntry, hidden: bool) -> String {
    if entry.is_dir {
        let name_str = format!("{}{}", "".cyan(), entry.name.cyan());
        if hidden {
            return format!("{}{}", name_str.dimmed(),"/".cyan().dimmed());
        }
        return format!("{}{}", name_str.bold() ,"/".cyan().bold());
    }
    if hidden {
        return format!("{}{}", "".dimmed(), entry.name.dimmed());
    }
    format!("{}{}", "".bold(), entry.name.bold())
}