diff --git a/src/archive/zip.rs b/src/archive/zip.rs index c0bdf48..a16468e 100644 --- a/src/archive/zip.rs +++ b/src/archive/zip.rs @@ -16,7 +16,7 @@ use crate::{ info, list::FileInArchive, utils::{ - self, cd_into_same_dir_as, concatenate_os_str_list, get_invalid_utf8_paths, strip_cur_dir, to_utf, Bytes, + self, cd_into_same_dir_as, get_invalid_utf8_paths, pretty_format_list_of_paths, strip_cur_dir, to_utf, Bytes, FileVisibilityPolicy, }, }; @@ -47,7 +47,7 @@ where display_zip_comment_if_exists(&file); - match (&*file.name()).ends_with('/') { + match file.name().ends_with('/') { _is_dir @ true => { // This is printed for every file in the archive and has little // importance for most users, but would generate lots of @@ -146,7 +146,7 @@ where .detail("Zip archives require files to have valid UTF-8 paths") .detail(format!( "Files with invalid paths: {}", - concatenate_os_str_list(&invalid_unicode_filenames) + pretty_format_list_of_paths(&invalid_unicode_filenames) )); return Err(error.into()); @@ -183,7 +183,7 @@ where return Err(e.into()); } }; - writer.write_all(&*file_bytes)?; + writer.write_all(&file_bytes)?; } } diff --git a/src/commands/decompress.rs b/src/commands/decompress.rs index f18ffe9..7ddbc9c 100644 --- a/src/commands/decompress.rs +++ b/src/commands/decompress.rs @@ -203,7 +203,8 @@ pub fn decompress_file( /// Unpacks an archive with some heuristics /// - If the archive contains only one file, it will be extracted to the `output_dir` -/// - If the archive contains multiple files, it will be extracted to a subdirectory of the output_dir named after the archive (given by `output_file_path`) +/// - If the archive contains multiple files, it will be extracted to a subdirectory of the +/// output_dir named after the archive (given by `output_file_path`) /// Note: This functions assumes that `output_dir` exists fn smart_unpack( unpack_fn: Box crate::Result>>, diff --git a/src/commands/mod.rs b/src/commands/mod.rs index ce971d5..fb4e4f8 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -22,7 +22,7 @@ use crate::{ info, list::ListOptions, utils::{ - self, concatenate_os_str_list, dir_is_empty, to_utf, try_infer_extension, user_wants_to_continue, + self, dir_is_empty, pretty_format_list_of_paths, to_utf, try_infer_extension, user_wants_to_continue, FileVisibilityPolicy, }, warning, Opts, QuestionAction, QuestionPolicy, Subcommand, @@ -266,7 +266,7 @@ pub fn run( let error = FinalError::with_title("Cannot decompress files without extensions") .detail(format!( "Files without supported extensions: {}", - concatenate_os_str_list(&files_missing_format) + pretty_format_list_of_paths(&files_missing_format) )) .detail("Decompression formats are detected automatically by the file extension") .hint("Provide a file with a supported extension:") @@ -323,7 +323,7 @@ pub fn run( .detail("Only archives can have their contents listed") .detail(format!( "Files are not archives: {}", - concatenate_os_str_list(¬_archives) + pretty_format_list_of_paths(¬_archives) )); return Err(error.into()); diff --git a/src/error.rs b/src/error.rs index 81ac85d..242a283 100644 --- a/src/error.rs +++ b/src/error.rs @@ -9,7 +9,6 @@ use std::{ use crate::utils::colors::*; -#[allow(missing_docs)] /// All errors that can be generated by `ouch` #[derive(Debug, PartialEq, Eq)] pub enum Error { @@ -53,7 +52,7 @@ pub struct FinalError { } impl Display for FinalError { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { // Title // // When in ACCESSIBLE mode, the square brackets are suppressed diff --git a/src/extension.rs b/src/extension.rs index 8995eef..a70c60d 100644 --- a/src/extension.rs +++ b/src/extension.rs @@ -39,7 +39,7 @@ impl Extension { } impl fmt::Display for Extension { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { self.display_text.fmt(f) } } @@ -174,7 +174,7 @@ mod tests { // Panics if formats has an empty list of compression formats pub fn split_first_compression_format(formats: &[Extension]) -> (CompressionFormat, Vec) { - let mut extensions: Vec = flatten_compression_formats(&formats); + let mut extensions: Vec = flatten_compression_formats(formats); let first_extension = extensions.remove(0); (first_extension, extensions) } diff --git a/src/utils/formatting.rs b/src/utils/formatting.rs index 97330c8..e250791 100644 --- a/src/utils/formatting.rs +++ b/src/utils/formatting.rs @@ -1,14 +1,11 @@ -use std::{borrow::Cow, cmp, path::Path}; +use std::{borrow::Cow, cmp, env, path::Path}; -// The lifetimes here could elided but I think they help -// comprehension in this case -#[allow(clippy::needless_lifetimes)] /// Converts an OsStr to utf8 with custom formatting. /// /// This is different from [`Path::display`]. /// /// See for a comparison. -pub fn to_utf<'a>(os_str: &'a Path) -> Cow<'a, str> { +pub fn to_utf(os_str: &Path) -> Cow { let format = || { let text = format!("{:?}", os_str); Cow::Owned(text.trim_matches('"').to_string()) @@ -17,34 +14,37 @@ pub fn to_utf<'a>(os_str: &'a Path) -> Cow<'a, str> { os_str.to_str().map_or_else(format, Cow::Borrowed) } -/// Removes the current dir from the beginning of a path -/// normally used for presentation sake. -/// If this function fails, it will return source path as a PathBuf. +/// Removes the current dir from the beginning of a path as it's redundant information, +/// useful for presentation sake. pub fn strip_cur_dir(source_path: &Path) -> &Path { - let cwd = std::env::current_dir().unwrap_or_else(|_| Path::new(".").to_path_buf()); - source_path.strip_prefix(cwd).unwrap_or(source_path) + let current_dir = env::current_dir(); + + let current_dir = match ¤t_dir { + Ok(inner) => inner.as_path(), + Err(_) => Path::new(""), + }; + + source_path.strip_prefix(current_dir).unwrap_or(source_path) } /// Converts a slice of AsRef to comma separated String /// /// Panics if the slice is empty. -pub fn concatenate_os_str_list(os_strs: &[impl AsRef]) -> String { +pub fn pretty_format_list_of_paths(os_strs: &[impl AsRef]) -> String { let mut iter = os_strs.iter().map(AsRef::as_ref); - let mut string = to_utf(iter.next().unwrap()).to_string(); // May panic + let first_element = iter.next().unwrap(); + let mut string = to_utf(first_element).into_owned(); for os_str in iter { string += ", "; - string += &*to_utf(os_str); + string += &to_utf(os_str); } string } -// The lifetimes here could elided but I think they help -// comprehension in this case -#[allow(clippy::needless_lifetimes)] -/// Display the directory name, but change to "current directory" when necessary. -pub fn nice_directory_display<'a>(path: &'a Path) -> Cow<'a, str> { +/// Display the directory name, but use "current directory" when necessary. +pub fn nice_directory_display(path: &Path) -> Cow { if path == Path::new(".") { Cow::Borrowed("current directory") } else { @@ -67,7 +67,7 @@ impl Bytes { } impl std::fmt::Display for Bytes { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { let num = self.bytes; debug_assert!(num >= 0.0); if num < 1_f64 { diff --git a/src/utils/mod.rs b/src/utils/mod.rs index e30037b..276fd74 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -10,7 +10,7 @@ mod fs; mod question; pub use file_visibility::FileVisibilityPolicy; -pub use formatting::{concatenate_os_str_list, nice_directory_display, strip_cur_dir, to_utf, Bytes}; +pub use formatting::{nice_directory_display, pretty_format_list_of_paths, strip_cur_dir, to_utf, Bytes}; pub use fs::{ cd_into_same_dir_as, clear_path, create_dir_if_non_existent, dir_is_empty, is_symlink, try_infer_extension, };