diff options
Diffstat (limited to 'examples/tree.rs')
-rw-r--r-- | examples/tree.rs | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/examples/tree.rs b/examples/tree.rs new file mode 100644 index 0000000..0a9bca3 --- /dev/null +++ b/examples/tree.rs @@ -0,0 +1,32 @@ +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), + } +} |