Better error message for MissingArgumentsForDecompression
[ouch.git] / src / utils.rs
blob3b6d4d1738641313626bcd1a667121dc75f68e10
1 use std::{
2     env,
3     ffi::OsStr,
4     fs,
5     path::{Path, PathBuf},
6 };
8 use colored::Colorize;
10 use crate::{dialogs::Confirmation, extension::CompressionFormat, file::File};
12 #[macro_export]
13 #[cfg(debug_assertions)]
14 macro_rules! debug {
15     ($x:expr) => {
16         dbg!($x)
17     };
20 #[macro_export]
21 #[cfg(not(debug_assertions))]
22 macro_rules! debug {
23     ($x:expr) => {
24         std::convert::identity($x)
25     };
28 pub(crate) fn ensure_exists<'a, P>(path: P) -> crate::Result<()>
29 where
30     P: AsRef<Path> + 'a,
32     let exists = path.as_ref().exists();
33     if !exists {
34         return Err(crate::Error::FileNotFound(PathBuf::from(path.as_ref())));
35     }
36     Ok(())
39 pub(crate) fn check_for_multiple_files(
40     files: &[PathBuf],
41     format: &CompressionFormat,
42 ) -> crate::Result<()> {
43     if files.len() != 1 {
44         eprintln!("{}: cannot compress multiple files directly to {:#?}.\n       Try using an intermediate archival method such as Tar.\n       Example: filename.tar{}", "[ERROR]".red(), format, format);
45         return Err(crate::Error::InvalidInput);
46     }
48     Ok(())
51 pub(crate) fn create_path_if_non_existent(path: &Path) -> crate::Result<()> {
52     if !path.exists() {
53         println!(
54             "{}: attempting to create folder {:?}.",
55             "[INFO]".yellow(),
56             &path
57         );
58         std::fs::create_dir_all(path)?;
59         println!(
60             "{}: directory {:#?} created.",
61             "[INFO]".yellow(),
62             fs::canonicalize(&path)?
63         );
64     }
65     Ok(())
68 pub(crate) fn get_destination_path<'a>(dest: &'a Option<File>) -> &'a Path {
69     match dest {
70         Some(output_file) => {
71             // Must be None according to the way command-line arg. parsing in Ouch works
72             assert_eq!(output_file.extension, None);
73             Path::new(&output_file.path)
74         }
75         None => Path::new("."),
76     }
79 pub(crate) fn change_dir_and_return_parent(filename: &Path) -> crate::Result<PathBuf> {
80     let previous_location = env::current_dir()?;
82     let parent = if let Some(parent) = filename.parent() {
83         parent
84     } else {
85         return Err(crate::Error::CompressingRootFolder);
86     };
88     env::set_current_dir(parent)
89         .ok()
90         .ok_or(crate::Error::CompressingRootFolder)?;
92     Ok(previous_location)
95 pub fn permission_for_overwriting(
96     path: &Path,
97     flags: &oof::Flags,
98     confirm: &Confirmation,
99 ) -> crate::Result<bool> {
100     match (flags.is_present("yes"), flags.is_present("false")) {
101         (true, true) => {
102             unreachable!("This shoul've been cutted out in the ~/src/cli.rs filter flags function.")
103         }
104         (true, _) => return Ok(true),
105         (_, true) => return Ok(false),
106         _ => {}
107     }
109     let file_path_str = to_utf(path);
110     confirm.ask(Some(&file_path_str))
113 pub fn to_utf(os_str: impl AsRef<OsStr>) -> String {
114     let text = format!("{:?}", os_str.as_ref());
115     text.trim_matches('"').to_string()