diff --git a/src/accessible.rs b/src/accessible.rs new file mode 100644 index 0000000..5f26411 --- /dev/null +++ b/src/accessible.rs @@ -0,0 +1,16 @@ +use once_cell::sync::OnceCell; + +/// Whether to enable accessible output (removes info output and reduces other +/// output, removes visual markers like '[' and ']'). +/// Removes th progress bar as well +pub static ACCESSIBLE: OnceCell = OnceCell::new(); + +pub fn is_running_in_accessible_mode() -> bool { + ACCESSIBLE.get().copied().unwrap_or(false) +} + +pub fn set_accessible(value: bool) { + if ACCESSIBLE.get().is_none() { + ACCESSIBLE.set(value).unwrap(); + } +} diff --git a/src/cli.rs b/src/cli.rs index f8578e6..e9366fa 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -8,14 +8,8 @@ use std::{ use clap::Parser; use fs_err as fs; -use once_cell::sync::OnceCell; -use crate::{utils::FileVisibilityPolicy, Opts, QuestionPolicy, Subcommand}; - -/// Whether to enable accessible output (removes info output and reduces other -/// output, removes visual markers like '[' and ']'). -/// Removes th progress bar as well -pub static ACCESSIBLE: OnceCell = OnceCell::new(); +use crate::{accessible::set_accessible, utils::FileVisibilityPolicy, Opts, QuestionPolicy, Subcommand}; impl Opts { /// A helper method that calls `clap::Parser::parse`. @@ -26,7 +20,7 @@ impl Opts { pub fn parse_args() -> crate::Result<(Self, QuestionPolicy, FileVisibilityPolicy)> { let mut opts = Self::parse(); - ACCESSIBLE.set(opts.accessible).unwrap(); + set_accessible(opts.accessible); let (Subcommand::Compress { files, .. } | Subcommand::Decompress { files, .. } diff --git a/src/commands/compress.rs b/src/commands/compress.rs index 05166a7..ddf24f8 100644 --- a/src/commands/compress.rs +++ b/src/commands/compress.rs @@ -20,14 +20,14 @@ use crate::{ // Compress files into an `output_file` // -// files are the list of paths to be compressed: ["dir/file1.txt", "dir/file2.txt"] -// formats contains each format necessary for compression, example: [Tar, Gz] (in compression order) -// output_file is the resulting compressed file name, example: "compressed.tar.gz" +// - `files`: is the list of paths to be compressed: ["dir/file1.txt", "dir/file2.txt"] +// - `extensions`: contains each compression format necessary for compressing, example: [Tar, Gz] (in compression order) +// - `output_file` is the resulting compressed file name, example: "compressed.tar.gz" // // Returns Ok(true) if compressed all files successfully, and Ok(false) if user opted to skip files pub fn compress_files( files: Vec, - formats: Vec, + extensions: Vec, output_file: fs::File, output_dir: &Path, question_policy: QuestionPolicy, @@ -72,13 +72,13 @@ pub fn compress_files( Ok(encoder) }; - let (first_extension, extensions) = split_first_compression_format(&formats); + let (first_format, formats) = split_first_compression_format(&extensions); - for format in extensions.iter().rev() { + for format in formats.iter().rev() { writer = chain_writer_encoder(format, writer)?; } - match first_extension { + match first_format { Gzip | Bzip | Lz4 | Lzma | Snappy | Zstd => { let _progress = Progress::new_accessible_aware( total_input_size, @@ -88,7 +88,7 @@ pub fn compress_files( })), ); - writer = chain_writer_encoder(&first_extension, writer)?; + writer = chain_writer_encoder(&first_format, writer)?; let mut reader = fs::File::open(&files[0]).unwrap(); io::copy(&mut reader, &mut writer)?; } @@ -113,7 +113,7 @@ pub fn compress_files( writer.flush()?; } Zip => { - if formats.len() > 1 { + if !formats.is_empty() { warn_user_about_loading_zip_in_memory(); // give user the option to continue compressing after warning is shown diff --git a/src/commands/mod.rs b/src/commands/mod.rs index 5e29ffa..c684cf7 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -1,6 +1,4 @@ -//! Core of the crate, where the `compress_files` and `decompress_file` functions are implemented -//! -//! Also, where correctly call functions based on the detected `Command`. +//! Receive command from the cli and call the respective function for that command. mod compress; mod decompress; diff --git a/src/error.rs b/src/error.rs index 242a283..967cb8a 100644 --- a/src/error.rs +++ b/src/error.rs @@ -7,7 +7,7 @@ use std::{ fmt::{self, Display}, }; -use crate::utils::colors::*; +use crate::{accessible::is_running_in_accessible_mode, utils::colors::*}; /// All errors that can be generated by `ouch` #[derive(Debug, PartialEq, Eq)] @@ -56,7 +56,7 @@ impl Display for FinalError { // Title // // When in ACCESSIBLE mode, the square brackets are suppressed - if *crate::cli::ACCESSIBLE.get().unwrap_or(&false) { + if is_running_in_accessible_mode() { write!(f, "{}ERROR{}: {}", *RED, *RESET, self.title)?; } else { write!(f, "{}[ERROR]{} {}", *RED, *RESET, self.title)?; @@ -73,7 +73,7 @@ impl Display for FinalError { writeln!(f)?; // to reduce redundant output for text-to-speach systems, braille // displays and so on, only print "hints" once in ACCESSIBLE mode - if *crate::cli::ACCESSIBLE.get().unwrap_or(&false) { + if is_running_in_accessible_mode() { write!(f, "\n{}hints:{}", *GREEN, *RESET)?; for hint in &self.hints { write!(f, "\n{}", hint)?; diff --git a/src/list.rs b/src/list.rs index ab6d836..2f2cf93 100644 --- a/src/list.rs +++ b/src/list.rs @@ -1,10 +1,11 @@ -//! Implementation of the 'list' command, print list of files in an archive +//! Some implementation helpers related to the 'list' command. use std::path::{Path, PathBuf}; use indicatif::{ProgressBar, ProgressStyle}; use self::tree::Tree; +use crate::accessible::is_running_in_accessible_mode; /// Options controlling how archive contents should be listed #[derive(Debug, Clone, Copy)] @@ -33,7 +34,7 @@ pub fn list_files( println!("Archive: {}", archive.display()); if list_options.tree { - let pb = if !crate::cli::ACCESSIBLE.get().unwrap() { + let pb = if !is_running_in_accessible_mode() { let template = "{wide_msg} [{elapsed_precise}] {spinner:.green}"; let pb = ProgressBar::new_spinner(); pb.set_style(ProgressStyle::default_bar().template(template)); @@ -46,7 +47,7 @@ pub fn list_files( .into_iter() .map(|file| { let file = file?; - if !crate::cli::ACCESSIBLE.get().unwrap() { + if !is_running_in_accessible_mode() { pb.as_ref() .expect("exists") .set_message(format!("Processing: {}", file.path.display())); @@ -77,7 +78,7 @@ fn print_entry(name: impl std::fmt::Display, is_dir: bool) { // if in ACCESSIBLE mode, use colors but print final / in case colors // aren't read out aloud with a screen reader or aren't printed on a // braille reader - } else if *crate::cli::ACCESSIBLE.get().unwrap() { + } else if is_running_in_accessible_mode() { println!("{}{}{}/{}", *BLUE, *STYLE_BOLD, name, *ALL_RESET); } else { println!("{}{}{}{}", *BLUE, *STYLE_BOLD, name, *ALL_RESET); @@ -105,6 +106,7 @@ mod tree { file: Option, children: LinkedHashMap, } + impl Tree { /// Insert a file into the tree pub fn insert(&mut self, file: FileInArchive) { diff --git a/src/macros.rs b/src/macros.rs index c2d209b..9068b6d 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -1,5 +1,7 @@ //! Macros used on ouch. +use crate::accessible::is_running_in_accessible_mode; + /// Macro that prints \[INFO\] messages, wraps [`println`]. /// /// There are essentially two different versions of the `info!()` macro: @@ -28,7 +30,7 @@ macro_rules! info { (@$display_handle: expr, accessible, $($arg:tt)*) => { let display_handle = &mut $display_handle; // if in ACCESSIBLE mode, suppress the "[INFO]" and just print the message - if !(*$crate::cli::ACCESSIBLE.get().unwrap()) { + if !$crate::accessible::is_running_in_accessible_mode() { $crate::macros::_info_helper(display_handle); } writeln!(display_handle, $($arg)*).unwrap(); @@ -39,8 +41,7 @@ macro_rules! info { info!(@::std::io::stdout(), inaccessible, $($arg)*); }; (@$display_handle: expr, inaccessible, $($arg:tt)*) => { - if (!$crate::cli::ACCESSIBLE.get().unwrap()) - { + if !$crate::accessible::is_running_in_accessible_mode() { let display_handle = &mut $display_handle; $crate::macros::_info_helper(display_handle); writeln!(display_handle, $($arg)*).unwrap(); @@ -68,7 +69,7 @@ macro_rules! warning { pub fn _warning_helper() { use crate::utils::colors::{ORANGE, RESET}; - if *crate::cli::ACCESSIBLE.get().unwrap() { + if is_running_in_accessible_mode() { eprint!("{}Warning:{} ", *ORANGE, *RESET); } else { eprint!("{}[WARNING]{} ", *ORANGE, *RESET); diff --git a/src/main.rs b/src/main.rs index 38c86f0..db876e9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ // Macros should be declared first pub mod macros; +pub mod accessible; pub mod archive; pub mod cli; pub mod commands; diff --git a/src/progress.rs b/src/progress.rs index b61cec5..5b318c9 100644 --- a/src/progress.rs +++ b/src/progress.rs @@ -8,6 +8,8 @@ use std::{ use indicatif::{ProgressBar, ProgressStyle}; +use crate::accessible::is_running_in_accessible_mode; + /// Draw a ProgressBar using a function that checks periodically for the progress pub struct Progress { draw_stop: Sender<()>, @@ -51,7 +53,7 @@ impl Progress { precise: bool, current_position_fn: Option u64 + Send>>, ) -> Option { - if *crate::cli::ACCESSIBLE.get().unwrap() { + if is_running_in_accessible_mode() { return None; } Some(Self::new(total_input_size, precise, current_position_fn)) diff --git a/src/utils/question.rs b/src/utils/question.rs index bea92dd..f8009ad 100644 --- a/src/utils/question.rs +++ b/src/utils/question.rs @@ -13,6 +13,7 @@ use fs_err as fs; use super::{strip_cur_dir, to_utf}; use crate::{ + accessible::is_running_in_accessible_mode, error::{Error, Result}, utils::colors, }; @@ -126,7 +127,7 @@ impl<'a> Confirmation<'a> { // Ask the same question to end while no valid answers are given loop { - if *crate::cli::ACCESSIBLE.get().unwrap() { + if is_running_in_accessible_mode() { print!( "{} {}yes{}/{}no{}: ", message,