From a0083cb571dfcb801b3e995cda2c7628457a3acc Mon Sep 17 00:00:00 2001 From: sreedev Date: Mon, 9 Jan 2023 22:15:44 -0500 Subject: [PATCH] table printing added --- Cargo.lock | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/output.rs | 35 +++++-------- 3 files changed, 154 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index de1b93e..b6aa929 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -40,6 +40,18 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bstr" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223" +dependencies = [ + "lazy_static", + "memchr", + "regex-automata", + "serde", +] + [[package]] name = "bumpalo" version = "3.11.1" @@ -223,6 +235,28 @@ dependencies = [ "winapi", ] +[[package]] +name = "csv" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" +dependencies = [ + "bstr", + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" +dependencies = [ + "memchr", +] + [[package]] name = "cxx" version = "1.0.85" @@ -280,6 +314,7 @@ dependencies = [ "glob", "humansize", "itertools", + "prettytable-rs", "rayon", "sqlite", "thiserror", @@ -287,12 +322,39 @@ dependencies = [ "tui", ] +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "either" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + [[package]] name = "errno" version = "0.2.8" @@ -323,6 +385,17 @@ dependencies = [ "byteorder", ] +[[package]] +name = "getrandom" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + [[package]] name = "glob" version = "0.3.0" @@ -417,6 +490,12 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + [[package]] name = "js-sys" version = "0.3.60" @@ -581,6 +660,20 @@ version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +[[package]] +name = "prettytable-rs" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eea25e07510aa6ab6547308ebe3c036016d162b8da920dbb079e3ba8acf3d95a" +dependencies = [ + "csv", + "encode_unicode", + "is-terminal", + "lazy_static", + "term", + "unicode-width", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -654,6 +747,23 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall", + "thiserror", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" + [[package]] name = "rustix" version = "0.36.5" @@ -668,6 +778,18 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "rustversion" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" + +[[package]] +name = "ryu" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" + [[package]] name = "scopeguard" version = "1.1.0" @@ -680,6 +802,12 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" +[[package]] +name = "serde" +version = "1.0.152" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" + [[package]] name = "signal-hook" version = "0.3.14" @@ -773,6 +901,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + [[package]] name = "termcolor" version = "1.1.3" diff --git a/Cargo.toml b/Cargo.toml index 7a5cc1b..09c3b6b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ fxhash = "0.2.1" glob = "0.3.0" humansize = "2.1.2" itertools = "0.10.5" +prettytable-rs = "0.10.0" rayon = "1.6.1" sqlite = "0.30.3" thiserror = "1.0.38" diff --git a/src/output.rs b/src/output.rs index 4824921..0724bd8 100644 --- a/src/output.rs +++ b/src/output.rs @@ -8,6 +8,7 @@ use humansize::{format_size, DECIMAL}; use crate::database::File; use crate::params::Params; +use prettytable::{row, Cell, Row, Table}; fn format_path(path: &str, opts: &Params) -> Result { let display_path = path.replace(&opts.get_directory()?, ""); @@ -37,20 +38,10 @@ fn modified_time(path: &String) -> Result { Ok(modified_time.format("%Y-%m-%d %H:%M:%S").to_string()) } -fn print_divider() { - println!("-------------------+-------------------------------------+------------------+----------------------------------+"); -} - pub fn print(duplicates: Vec, opts: &Params) { - print_divider(); - println!( - "| {0: <16} | {1: <35} | {2: <16} | {3: <32} |", - "hash", "filename", "size", "updated_at" - ); - print_divider(); - + let mut output_table = Table::new(); let mut dup_index: HashMap> = HashMap::new(); - + output_table.add_row(row!["hash", "duplicates"]); duplicates.into_iter().for_each(|file| { dup_index .entry(file.hash.clone()) @@ -58,16 +49,18 @@ pub fn print(duplicates: Vec, opts: &Params) { .or_insert_with(|| vec![file]); }); - dup_index.iter().for_each(|(_, group)| { + dup_index.iter().for_each(|(hash, group)| { + let mut inner_table = Table::new(); + inner_table.add_row(row!["filename", "size", "updated_at"]); group.iter().for_each(|file| { - println!( - "| {0: <16} | {1: <35} | {2: <16} | {3: <32} |", - file.hash.red(), - format_path(&file.path, opts).unwrap_or_default().yellow(), - file_size(&file.path).unwrap_or_default().blue(), - modified_time(&file.path).unwrap_or_default().blue() - ); + inner_table.add_row(row![ + format_path(&file.path, opts).unwrap_or_default().blue(), + file_size(&file.path).unwrap_or_default().red(), + modified_time(&file.path).unwrap_or_default().yellow() + ]); }); - print_divider(); + output_table.add_row(row![hash, inner_table]); }); + + output_table.printstd(); }