diff --git a/Cargo.lock b/Cargo.lock index c047a45..7808f4f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -406,6 +406,17 @@ dependencies = [ "vec_map", ] +[[package]] +name = "colored" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" +dependencies = [ + "atty", + "lazy_static", + "winapi", +] + [[package]] name = "comfy-table" version = "2.1.0" @@ -639,6 +650,26 @@ dependencies = [ "generic-array", ] +[[package]] +name = "directories" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e69600ff1703123957937708eb27f7a564e48885c537782722ed0ba3189ce1d7" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "discard" version = "1.0.4" @@ -925,6 +956,17 @@ dependencies = [ "wasi 0.9.0+wasi-snapshot-preview1", ] +[[package]] +name = "getrandom" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", +] + [[package]] name = "ghash" version = "0.3.0" @@ -1445,7 +1487,9 @@ dependencies = [ "async-std", "atty", "clap", + "colored", "comfy-table", + "directories", "epub-builder", "flexi_logger", "futures", @@ -1680,7 +1724,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.15", "libc", "rand_chacha", "rand_core 0.5.1", @@ -1719,7 +1763,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "getrandom 0.1.15", ] [[package]] @@ -1764,6 +1808,16 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_users" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +dependencies = [ + "getrandom 0.2.2", + "redox_syscall 0.2.6", +] + [[package]] name = "regex" version = "1.4.5" diff --git a/Cargo.toml b/Cargo.toml index 7cdfcd4..b37aea1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,9 @@ readme = "README.md" async-std = "1.9.0" atty = "0.2.14" clap = "2.33.3" +colored = "2.0.0" comfy-table = "2.1.0" +directories = "3.0.2" epub-builder = "0.4.8" flexi_logger = "0.17.1" futures = "0.3.14" diff --git a/src/logs.rs b/src/logs.rs index c2275c6..6efec8a 100644 --- a/src/logs.rs +++ b/src/logs.rs @@ -1,5 +1,6 @@ +use colored::*; use comfy_table::presets::UTF8_HORIZONTAL_BORDERS_ONLY; -use comfy_table::{Attribute, Cell, CellAlignment, ContentArrangement, Table}; +use comfy_table::{Cell, CellAlignment, ContentArrangement, Table}; use log::error; use crate::errors::PaperoniError; @@ -18,17 +19,14 @@ pub fn display_summary( successfully_downloaded_count, errors.len() ) + .bold() ); if successfully_downloaded_count > 0 { println!("{}", succesful_articles_table); } if !errors.is_empty() { - println!( - "{}Failed article downloads{}", - Attribute::Bold, - Attribute::NormalIntensity - ); + println!("\n{}", "Failed article downloads".bright_red().bold()); let mut table_failed = Table::new(); table_failed .load_preset(UTF8_HORIZONTAL_BORDERS_ONLY) @@ -56,10 +54,14 @@ fn short_summary(initial_count: usize, successful_count: usize, failed_count: us panic!("initial_count must be equal to the sum of failed and successful count") } let get_noun = |count: usize| if count == 1 { "article" } else { "articles" }; - if successful_count == initial_count { - "All articles downloaded successfully".into() + if successful_count == initial_count && successful_count == 1 { + "Article downloaded successfully".green().to_string() + } else if initial_count == failed_count && failed_count == 1 { + "Article failed to download".red().to_string() + } else if successful_count == initial_count { + "All articles downloaded successfully".green().to_string() } else if successful_count == 0 { - "All articles failed to download".into() + "All articles failed to download".red().to_string() } else { format!( "{} {} downloaded successfully, {} {} failed", @@ -68,33 +70,50 @@ fn short_summary(initial_count: usize, successful_count: usize, failed_count: us failed_count, get_noun(failed_count) ) + .yellow() + .to_string() } } #[cfg(test)] mod tests { use super::short_summary; + use colored::*; #[test] fn test_short_summary() { + assert_eq!( + short_summary(1, 1, 0), + "Article downloaded successfully".green().to_string() + ); + assert_eq!( + short_summary(1, 0, 1), + "Article failed to download".red().to_string() + ); assert_eq!( short_summary(10, 10, 0), - "All articles downloaded successfully".to_string() + "All articles downloaded successfully".green().to_string() ); assert_eq!( short_summary(10, 0, 10), - "All articles failed to download".to_string() + "All articles failed to download".red().to_string() ); assert_eq!( short_summary(10, 8, 2), - "8 articles downloaded successfully, 2 articles failed".to_string() + "8 articles downloaded successfully, 2 articles failed" + .yellow() + .to_string() ); assert_eq!( short_summary(10, 1, 9), - "1 article downloaded successfully, 9 articles failed".to_string() + "1 article downloaded successfully, 9 articles failed" + .yellow() + .to_string() ); assert_eq!( short_summary(7, 6, 1), - "6 articles downloaded successfully, 1 article failed".to_string() + "6 articles downloaded successfully, 1 article failed" + .yellow() + .to_string() ); } diff --git a/src/main.rs b/src/main.rs index d23311d..7fa1ddb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,6 +5,7 @@ use async_std::stream; use async_std::task; use comfy_table::presets::{UTF8_FULL, UTF8_HORIZONTAL_BORDERS_ONLY}; use comfy_table::{ContentArrangement, Table}; +use directories::UserDirs; use futures::stream::StreamExt; use indicatif::{ProgressBar, ProgressStyle}; use log::{debug, warn}; @@ -30,13 +31,26 @@ fn main() { let app_config = cli::cli_init(); if !app_config.urls().is_empty() { - match flexi_logger::Logger::with_str("paperoni=debug") - .log_to_file() - .start() - { - Ok(_) => (), - Err(e) => eprintln!("Unable to start logger!\n{}", e), - } + match UserDirs::new() { + Some(user_dirs) => { + let home_dir = user_dirs.home_dir(); + let paperoni_dir = home_dir.join(".paperoni"); + let log_dir = paperoni_dir.join("logs"); + if !paperoni_dir.is_dir() || !log_dir.is_dir() { + std::fs::create_dir_all(&log_dir) + .expect("Unable to create paperoni directories on home directory for logging purposes"); + } + match flexi_logger::Logger::with_str("paperoni=debug") + .directory(log_dir) + .log_to_file() + .start() + { + Ok(_) => (), + Err(e) => eprintln!("Unable to start logger!\n{}", e), + } + } + None => eprintln!("Unable to get user directories for logging purposes"), + }; download(app_config); } }