Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,4 @@ clap = "=2.33"
assert_cli = "=0.5"
tempfile = "=3"
walkdir = "=2"

either = "=1.5"
33 changes: 16 additions & 17 deletions src/display.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
extern crate ansi_term;

use either::*;

use self::ansi_term::Colour::Fixed;
use self::ansi_term::Style;
use crate::utils::Node;
Expand Down Expand Up @@ -38,18 +40,16 @@ impl DisplayData {
} else {
"├──"
}
} else {
if num_siblings == 0 {
if has_children {
"└─┬"
} else {
"└──"
}
} else if has_children {
"├─┬"
} else if num_siblings == 0 {
if has_children {
"└─┬"
} else {
"──"
"──"
}
} else if has_children {
"├─┬"
} else {
"├──"
}
}

Expand All @@ -61,12 +61,11 @@ impl DisplayData {
}
}

fn get_children_from_node(&self, node: Node) -> impl Iterator<Item = Box<Node>> {
fn get_children_from_node(&self, node: Node) -> impl IntoIterator<Item = Node> {
if self.is_reversed {
let n: Vec<Box<Node>> = node.children.into_iter().rev().map(|a| a).collect();
return n.into_iter();
Left(node.children.into_iter().rev())
} else {
return node.children.into_iter();
Right(node.children.into_iter())
}
}
}
Expand All @@ -82,7 +81,7 @@ pub fn draw_it(permissions: bool, use_full_path: bool, is_reversed: bool, root_n

for c in display_data.get_children_from_node(root_node) {
let first_tree_chars = display_data.get_first_chars();
display_node(*c, true, first_tree_chars, &display_data)
display_node(c, true, first_tree_chars, &display_data)
}
}

Expand All @@ -101,10 +100,10 @@ fn display_node(node: Node, is_biggest: bool, indent: &str, display_data: &Displ

for c in display_data.get_children_from_node(node) {
num_siblings -= 1;
let chars = display_data.get_tree_chars(num_siblings, max_sibling, c.children.len() > 0);
let chars = display_data.get_tree_chars(num_siblings, max_sibling, !c.children.is_empty());
let is_biggest = display_data.is_biggest(num_siblings, max_sibling);
let full_indent = new_indent.clone() + chars;
display_node(*c, is_biggest, &*full_indent, display_data)
display_node(c, is_biggest, &*full_indent, display_data)
}

if display_data.is_reversed {
Expand Down
3 changes: 1 addition & 2 deletions src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,7 @@ fn recursively_build_tree(parent_node: &mut Node, new_node: Node, depth: Option<
return recursively_build_tree(&mut *c, new_node, new_depth);
}
}
let temp = Box::<Node>::new(new_node);
parent_node.children.push(temp);
parent_node.children.push(new_node);
}

#[cfg(test)]
Expand Down
2 changes: 1 addition & 1 deletion src/utils/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use self::platform::*;
pub struct Node {
pub name: String,
pub size: u64,
pub children: Vec<Box<Node>>,
pub children: Vec<Node>,
}

pub fn simplify_dir_names(filenames: Vec<&str>) -> HashSet<String> {
Expand Down
9 changes: 5 additions & 4 deletions src/utils/platform.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use walkdir::DirEntry;

#[allow(dead_code)]
fn get_block_size() -> u64 {
// All os specific implementations of MetatdataExt seem to define a block as 512 bytes
// https://doc.rust-lang.org/std/os/linux/fs/trait.MetadataExt.html#tymethod.st_blocks
Expand All @@ -9,17 +10,17 @@ fn get_block_size() -> u64 {
#[cfg(target_family = "unix")]
pub fn get_metadata(d: &DirEntry, use_apparent_size: bool) -> Option<(u64, Option<(u64, u64)>)> {
use std::os::unix::fs::MetadataExt;
d.metadata().ok().and_then(|md| {
d.metadata().ok().map(|md| {
let inode = Some((md.ino(), md.dev()));
if use_apparent_size {
Some((md.len(), inode))
(md.len(), inode)
} else {
Some((md.blocks() * get_block_size(), inode))
(md.blocks() * get_block_size(), inode)
}
})
}

#[cfg(not(target_family = "unix"))]
pub fn get_metadata(d: &DirEntry, _apparent: bool) -> Option<(u64, Option<(u64, u64)>)> {
d.metadata().ok().map_or(None, |md| Some((md.len(), None)))
d.metadata().ok().map(|md| (md.len(), None))
}