| use termtree::Tree; |
| |
| use std::path::Path; |
| use std::{env, fs, io}; |
| |
| fn label<P: AsRef<Path>>(p: P) -> String { |
| p.as_ref().file_name().unwrap().to_str().unwrap().to_owned() |
| } |
| |
| fn tree<P: AsRef<Path>>(p: P) -> io::Result<Tree<String>> { |
| let result = fs::read_dir(&p)?.filter_map(|e| e.ok()).fold( |
| Tree::new(label(p.as_ref().canonicalize()?)), |
| |mut root, entry| { |
| let dir = entry.metadata().unwrap(); |
| if dir.is_dir() { |
| root.push(tree(entry.path()).unwrap()); |
| } else { |
| root.push(Tree::new(label(entry.path()))); |
| } |
| root |
| }, |
| ); |
| Ok(result) |
| } |
| |
| fn main() { |
| let dir = env::args().nth(1).unwrap_or_else(|| String::from(".")); |
| match tree(dir) { |
| Ok(tree) => println!("{}", tree), |
| Err(err) => println!("error: {}", err), |
| } |
| } |