summaryrefslogtreecommitdiff
path: root/examples/tree.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/tree.rs')
-rw-r--r--examples/tree.rs32
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),
+ }
+}