pub mod cli;
pub mod config;
pub mod error;
pub mod filters;
pub mod formatter;
pub mod stats;
pub mod walker;
pub use cli::Args;
pub use config::Config;
pub use error::{Error, Result};
pub use filters::{FilterOptions, SortBy};
pub use formatter::{FormatOptions, OutputFormat};
pub use stats::{FileStats, TreeStats};
pub use walker::{TreeEntry, Walker};
use std::path::Path;
pub fn run_tree(path: &Path, args: &Args, config: &Config) -> Result<()> {
log::debug!("Starting tree traversal at: {:?}", path);
if matches!(args.output, OutputFormat::Plain) && args.dist.is_none() && !args.total_size {
log::debug!("Using streaming output");
let filter_opts = FilterOptions::from_args_and_config(args, config)?;
let mut stream_walker = walker::StreamWalker::new(
filter_opts,
args.output,
args.show_size,
args.show_lines,
args.unicode,
);
return stream_walker.stream(path);
}
log::debug!("Using standard walker with full features");
let filter_opts = FilterOptions::from_args_and_config(args, config)?;
let format_opts = FormatOptions::from_args_and_config(args, config);
let mut walker = Walker::new(path, filter_opts, args.threads)?;
walker.set_max_file_size(args.max_file_size);
if args.show_lines {
walker.enable_line_counting();
}
if args.dir_sizes {
walker.enable_dir_sizes();
}
let entries = walker.walk()?;
match args.output {
OutputFormat::Tree => formatter::print_tree(&entries, &format_opts)?,
OutputFormat::Json => formatter::print_json(&entries)?,
OutputFormat::Csv => formatter::print_csv(&entries)?,
OutputFormat::Plain => formatter::print_plain(&entries)?,
}
if args.total_size && matches!(args.output, OutputFormat::Tree) {
let stats = TreeStats::from_entries(&entries);
formatter::print_total_size(&stats, &format_opts)?;
}
if let Some(dist_type) = &args.dist {
formatter::print_distribution(&entries, dist_type, args.top, &args.format, &format_opts)?;
}
Ok(())
}