mirror of
https://github.com/bootandy/dust.git
synced 2026-01-11 12:36:05 -08:00
- Try to use iterator adapters and collect in various places, where possible. This especially benefits draw_it. - Try to use `.map` and other similar methods on Options and Results, where possible - Replaced nearly all clones with reference-based equivalents - Summarizing nodes by file extension is now much more efficient - PartialOrd and PartialEq implementations now agree - Replace #[cfg(...)] function definitions with simpler if cfg!(...) equivelents - Simplify CLI Values handling by taking advantage of Values::default - Various spelling corrections in comments - Add `ColorState` enum to replace bool, for clarity - Fix tests that break under some detected terminal widths when paths are long - Use sort_by instead of (sort, reverse) - Use new `ExtensionNode` struct internally to simplify extension aggregation code
79 lines
1.9 KiB
Rust
79 lines
1.9 KiB
Rust
use crate::platform::get_metadata;
|
|
use crate::utils::is_filtered_out_due_to_invert_regex;
|
|
use crate::utils::is_filtered_out_due_to_regex;
|
|
|
|
use regex::Regex;
|
|
use std::cmp::Ordering;
|
|
use std::path::PathBuf;
|
|
|
|
#[derive(Debug, Eq, Clone)]
|
|
pub struct Node {
|
|
pub name: PathBuf,
|
|
pub size: u64,
|
|
pub children: Vec<Node>,
|
|
pub inode_device: Option<(u64, u64)>,
|
|
pub depth: usize,
|
|
}
|
|
|
|
#[allow(clippy::too_many_arguments)]
|
|
pub fn build_node(
|
|
dir: PathBuf,
|
|
children: Vec<Node>,
|
|
filter_regex: &[Regex],
|
|
invert_filter_regex: &[Regex],
|
|
use_apparent_size: bool,
|
|
is_symlink: bool,
|
|
is_file: bool,
|
|
by_filecount: bool,
|
|
depth: usize,
|
|
) -> Option<Node> {
|
|
get_metadata(&dir, use_apparent_size).map(|data| {
|
|
let inode_device = if is_symlink && !use_apparent_size {
|
|
None
|
|
} else {
|
|
data.1
|
|
};
|
|
|
|
let size = if is_filtered_out_due_to_regex(filter_regex, &dir)
|
|
|| is_filtered_out_due_to_invert_regex(invert_filter_regex, &dir)
|
|
|| (is_symlink && !use_apparent_size)
|
|
|| by_filecount && !is_file
|
|
{
|
|
0
|
|
} else if by_filecount {
|
|
1
|
|
} else {
|
|
data.0
|
|
};
|
|
|
|
Node {
|
|
name: dir,
|
|
size,
|
|
children,
|
|
inode_device,
|
|
depth,
|
|
}
|
|
})
|
|
}
|
|
|
|
impl PartialEq for Node {
|
|
fn eq(&self, other: &Self) -> bool {
|
|
self.name == other.name && self.size == other.size && self.children == other.children
|
|
}
|
|
}
|
|
|
|
impl Ord for Node {
|
|
fn cmp(&self, other: &Self) -> Ordering {
|
|
self.size
|
|
.cmp(&other.size)
|
|
.then_with(|| self.name.cmp(&other.name))
|
|
.then_with(|| self.children.cmp(&other.children))
|
|
}
|
|
}
|
|
|
|
impl PartialOrd for Node {
|
|
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
|
Some(self.cmp(other))
|
|
}
|
|
}
|