From 8b84038ceccc6ed57e8c8c5dbb4dda3652c7c93c Mon Sep 17 00:00:00 2001 From: Talison Fabio <54823205+talis-fb@users.noreply.github.com> Date: Sat, 22 Mar 2025 20:21:23 -0300 Subject: [PATCH] feat: create "resolve_path" for smart_unpack to deal with rename --- src/utils/fs.rs | 18 ++++++++++++++++++ src/utils/question.rs | 15 ++++++--------- 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/utils/fs.rs b/src/utils/fs.rs index 22f8676..d7309fa 100644 --- a/src/utils/fs.rs +++ b/src/utils/fs.rs @@ -34,6 +34,24 @@ pub fn clear_path(path: &Path, question_policy: QuestionPolicy) -> crate::Result Ok(true) } +pub fn resolve_path(path: &Path, question_policy: QuestionPolicy) -> crate::Result> { + if path.exists() { + match user_wants_to_overwrite(path, question_policy)? { + FileConflitOperation::Cancel => return Ok(None), + FileConflitOperation::Overwrite => { + remove_file_or_dir(path)?; + Ok(Some(path.to_path_buf())) + }, + FileConflitOperation::Rename => { + let renamed_path = rename_for_available_filename(path); + Ok(Some(renamed_path)) + }, + } + } else { + Ok(Some(path.to_path_buf())) + } +} + pub fn remove_file_or_dir(path: &Path) -> crate::Result<()> { if path.is_dir() { fs::remove_dir_all(path)?; diff --git a/src/utils/question.rs b/src/utils/question.rs index 034f186..7510b49 100644 --- a/src/utils/question.rs +++ b/src/utils/question.rs @@ -46,16 +46,13 @@ pub enum FileConflitOperation { } /// Check if QuestionPolicy flags were set, otherwise, ask user if they want to overwrite. -pub fn user_wants_to_overwrite(path: &Path, question_policy: QuestionPolicy) -> crate::Result { +pub fn user_wants_to_overwrite(path: &Path, question_policy: QuestionPolicy) -> crate::Result { + use FileConflitOperation as Op; + match question_policy { - QuestionPolicy::AlwaysYes => Ok(true), - QuestionPolicy::AlwaysNo => Ok(false), - QuestionPolicy::Ask => { - let path = path_to_str(strip_cur_dir(path)); - let path = Some(&*path); - let placeholder = Some("FILE"); - Confirmation::new("Do you want to overwrite 'FILE'?", placeholder).ask(path) - } + QuestionPolicy::AlwaysYes => Ok(Op::Overwrite), + QuestionPolicy::AlwaysNo => Ok(Op::Cancel), + QuestionPolicy::Ask => ask_file_conflict_operation(path), } }