diff --git a/src/commands/decompress.rs b/src/commands/decompress.rs index a914fb4..83671dd 100644 --- a/src/commands/decompress.rs +++ b/src/commands/decompress.rs @@ -31,6 +31,7 @@ pub struct DecompressOptions<'a> { pub formats: Vec, pub output_dir: &'a Path, pub output_file_path: PathBuf, + pub is_output_dir_provided: bool, pub is_smart_unpack: bool, pub question_policy: QuestionPolicy, pub quiet: bool, @@ -74,6 +75,7 @@ pub fn decompress_file(options: DecompressOptions) -> crate::Result<()> { options.output_dir, &options.output_file_path, options.question_policy, + options.is_output_dir_provided, options.is_smart_unpack, )? { files @@ -152,6 +154,7 @@ pub fn decompress_file(options: DecompressOptions) -> crate::Result<()> { options.output_dir, &options.output_file_path, options.question_policy, + options.is_output_dir_provided, options.is_smart_unpack, )? { files @@ -186,6 +189,7 @@ pub fn decompress_file(options: DecompressOptions) -> crate::Result<()> { options.output_dir, &options.output_file_path, options.question_policy, + options.is_output_dir_provided, options.is_smart_unpack, )? { files @@ -218,6 +222,7 @@ pub fn decompress_file(options: DecompressOptions) -> crate::Result<()> { options.output_dir, &options.output_file_path, options.question_policy, + options.is_output_dir_provided, options.is_smart_unpack, )? { files @@ -260,6 +265,7 @@ pub fn decompress_file(options: DecompressOptions) -> crate::Result<()> { options.output_dir, &options.output_file_path, options.question_policy, + options.is_output_dir_provided, options.is_smart_unpack, )? { files @@ -295,13 +301,20 @@ fn execute_decompression( output_dir: &Path, output_file_path: &Path, question_policy: QuestionPolicy, + is_output_dir_provided: bool, is_smart_unpack: bool, ) -> crate::Result> { if is_smart_unpack { - smart_unpack(unpack_fn, output_dir, output_file_path, question_policy) - } else { - unpack(unpack_fn, output_dir, question_policy) + return smart_unpack(unpack_fn, output_dir, output_file_path, question_policy); } + + let target_output_dir = if is_output_dir_provided { + output_dir + } else { + output_file_path + }; + + return unpack(unpack_fn, target_output_dir, question_policy); } /// Unpacks an archive creating the output directory, this function will create the output_dir diff --git a/src/commands/mod.rs b/src/commands/mod.rs index e2b85de..8142bc0 100644 --- a/src/commands/mod.rs +++ b/src/commands/mod.rs @@ -146,7 +146,7 @@ pub fn run( } Subcommand::Decompress { files, - output_dir, + mut output_dir, remove, no_smart_unpack, } => { @@ -177,9 +177,13 @@ pub fn run( check::check_missing_formats_when_decompressing(&files, &formats)?; + let is_smart_unpack = !no_smart_unpack && output_dir.is_none(); + + let is_output_dir_provided = output_dir.is_some(); + let is_smart_unpack = !is_output_dir_provided && !no_smart_unpack; + // The directory that will contain the output files // We default to the current directory if the user didn't specify an output directory with --dir - let is_smart_unpack = !no_smart_unpack && output_dir.is_none(); let output_dir = if let Some(dir) = output_dir { utils::create_dir_if_non_existent(&dir)?; dir @@ -201,6 +205,7 @@ pub fn run( decompress_file(DecompressOptions { input_file_path: input_path, formats, + is_output_dir_provided, output_dir: &output_dir, output_file_path, is_smart_unpack,