dirwalk 1.1.1

Platform-optimized recursive directory walker with metadata
Documentation
use crate::entry::Entry;
use crate::tree::{self, TreeEntry};
use std::io::{self, Write};

pub fn write(w: &mut impl Write, entries: &[&Entry]) -> io::Result<()> {
    let tree = tree::to_tree(entries);
    for (i, node) in tree.iter().enumerate() {
        let is_last = i == tree.len() - 1;
        write_node(w, node, "", is_last)?;
    }
    Ok(())
}

fn write_node(w: &mut impl Write, node: &TreeEntry, prefix: &str, is_last: bool) -> io::Result<()> {
    let connector = if is_last { "└── " } else { "├── " };
    writeln!(w, "{}{}{}", prefix, connector, node.entry.name())?;

    let child_prefix = if is_last {
        format!("{}    ", prefix)
    } else {
        format!("{}", prefix)
    };

    for (i, child) in node.children.iter().enumerate() {
        let child_is_last = i == node.children.len() - 1;
        write_node(w, child, &child_prefix, child_is_last)?;
    }
    Ok(())
}