durt 1.0.3

Command line tool for calculating the size of files and directories
Documentation
use clap::{IntoApp, Parser};
use tabular::{Row, Table};
use wild;

mod cli;
use cli::Cli;
use durt::{format_size, Entry};

fn main() {
    #[cfg(windows)]
    ansi_term::enable_ansi_support().expect("Failed to enable ANSI support.");

    let cli = Cli::parse_from(wild::args_os());

    if cli.paths.is_empty() {
        Cli::into_app().print_help().unwrap();
        return;
    }

    let all_entries = cli.paths.iter().filter_map(|path| Entry::from_path(&path));
    let mut entries: Vec<Entry>;

    #[cfg(unix)]
    {
        entries = if cli.same_fs {
            let mut all_entries = all_entries.peekable();
            let first_fs = match all_entries.peek() {
                Some(first) => first.filesystem_id,
                None => return,
            };

            all_entries
                .filter(|e| e.filesystem_id == first_fs)
                .collect()
        } else {
            all_entries.collect()
        };
    }

    #[cfg(not(unix))]
    {
        entries = all_entries.collect::<Vec<_>>();
    }

    if cli.sort {
        if cli.sort_by_path {
            entries.sort_by(|a, b| a.path.cmp(&b.path));
        } else {
            entries.sort_by_key(|e| e.size);
        }
    }

    if cli.reverse_order {
        entries.reverse();
    }

    let mut table = if cli.show_percentages {
        Table::new("  {:>}  {:>}  {:<}")
    } else {
        Table::new("  {:>}  {:<}")
    };

    let total_size = entries.iter().map(|e| e.size).sum();
    let mut omitted_entries = 0;

    for entry in entries {
        let percentage = entry.size as f64 / total_size as f64 * 100.0;

        if let Some(m) = cli.minimum_percentage {
            if percentage < m {
                omitted_entries += 1;
                continue;
            }
        }

        let formatted_size = format_size(entry.size, cli.use_binary_prefixes);
        let mut row = Row::new().with_cell(formatted_size);

        if cli.show_percentages {
            row.add_cell(format!("({:>5.2}%)", percentage));
        }

        row.add_cell(entry.path.display());
        table.add_row(row);
    }

    if omitted_entries > 0 {
        let mut row = Row::new().with_cell("");

        if cli.show_percentages {
            row.add_cell("");
        }

        row.add_cell(if omitted_entries == 1 {
            format!("({} entry omitted)", omitted_entries)
        } else {
            format!("({} entries omitted)", omitted_entries)
        });

        table.add_row(row);
    }

    if cli.show_total {
        let separator = "-".repeat(if cli.use_binary_prefixes { 10 } else { 9 });
        let mut row = Row::new().with_cell(separator);

        if cli.show_percentages {
            row.add_cell("");
        }

        table.add_row(row.with_cell(""));

        let formatted_total = format_size(total_size, cli.use_binary_prefixes);
        let mut row = Row::new().with_cell(formatted_total);

        if cli.show_percentages {
            row.add_cell("");
        }

        row.add_cell("(total)");
        table.add_row(row);
    }

    print!("{}", table);
}