From 95b86f80aad7fe10de23b5eb9cce478cce1cc158 Mon Sep 17 00:00:00 2001 From: pyro Date: Thu, 21 May 2026 13:51:04 -0500 Subject: [PATCH] updated remove project logic to check if the client folders are empty, and if they are deltes them. --- src/funcs.rs | 19 ++++------ src/lib.rs | 104 +++++++++++++++++++++++++++++++-------------------- 2 files changed, 72 insertions(+), 51 deletions(-) diff --git a/src/funcs.rs b/src/funcs.rs index c138f41..16c5e20 100644 --- a/src/funcs.rs +++ b/src/funcs.rs @@ -226,17 +226,14 @@ pub fn run_tui( state.output.push("\n".to_string()); state.output.push(format!("[user input] > {}", trimmed)); state.output.push("\n".to_string()); - if let Some(action) = state.prompt.action.clone() { - match action { - ToolMessage::RemoveProject => { - if trimmed.to_lowercase().contains("y") { - state.execute_command( - "remove_project_confirm", - None, - )?; - } - } - _ => {} + let prompt = state.prompt.clone(); + if prompt.action.is_some() { + state.prompt.responses.push(trimmed.clone()); + if state.prompt.responses.len() == state.prompt.num_responses { + state.execute_command( + prompt.execute_command.as_str(), + None, + )?; } } let (command, args) = diff --git a/src/lib.rs b/src/lib.rs index a5caa30..ff89fe3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,7 +3,7 @@ use ratatui::crossterm::event; use rhai::{AST, Dynamic, Engine, Scope}; use std::collections::HashMap; use std::error::Error; -use std::fs::{self, File, create_dir_all, read_dir, read_to_string, remove_dir_all}; +use std::fs::{self, File, create_dir_all, read_dir, read_to_string, remove_dir, remove_dir_all}; use std::io::{self, BufRead, BufReader, Write}; use std::path::PathBuf; use std::process::{Command, Stdio}; @@ -57,6 +57,8 @@ impl AppState { prompt: Prompt { action: None, responses: Vec::new(), + execute_command: String::new(), + num_responses: 0, }, }, main_rx, @@ -208,50 +210,69 @@ impl AppState { self.promote_project()?; } "remove_project_confirm" => { - let project = self.projects[self.selected_project].clone(); - let mut config_file = project.config_folder.clone(); - config_file.pop(); - if let Err(e) = remove_dir_all(&project.config_folder) { - let _ = self.main_tx.send(ToolMessage::Output(format!( - "failed to delete config: {e} on {}", - &project.config_folder.display() - ))); - } - if let Err(e) = remove_dir_all(&project.notes) { - let _ = self.main_tx.send(ToolMessage::Output(format!( - "failed to delete notes: {e} on {}", - &project.notes.display() - ))); - } - if let Err(e) = remove_dir_all(&project.files) { - let _ = self.main_tx.send(ToolMessage::Output(format!( - "failed to delete files: {e} on {}", - &project.files.display() - ))); - } - self.projects.remove(self.selected_project); self.prompt.action = None; + self.prompt.num_responses = 0; + if self.prompt.responses.len() > 0 { + if self.prompt.responses[0] == "y".to_string() { + let project = self.projects[self.selected_project].clone(); + let mut config_file = project.config_folder.clone(); + config_file.pop(); + if let Err(e) = remove_dir_all(&project.config_folder) { + let _ = self.main_tx.send(ToolMessage::Output(format!( + "failed to delete config: {e} on {}", + &project.config_folder.display() + ))); + } + if let Err(e) = remove_dir_all(&project.notes) { + let _ = self.main_tx.send(ToolMessage::Output(format!( + "failed to delete notes: {e} on {}", + &project.notes.display() + ))); + } else if let Some(parent) = project.notes.parent() { + if let Ok(mut entries) = read_dir(parent) { + if entries.next().is_none() { + if let Err(e) = remove_dir(parent) { + let _ = self.main_tx.send(ToolMessage::Output(format!("failed to delete the empty client notes folder: {e} on {}", parent.display()))); + } + } + } + } + if let Err(e) = remove_dir_all(&project.files) { + let _ = self.main_tx.send(ToolMessage::Output(format!( + "failed to delete files: {e} on {}", + &project.files.display() + ))); + } else if let Some(parent) = project.files.parent() { + if let Ok(mut entries) = read_dir(parent) { + if entries.next().is_none() { + if let Err(e) = remove_dir(parent) { + let _ = self.main_tx.send(ToolMessage::Output(format!( + "failed to delete empty files parent: {e} on {}", + parent.display() + ))); + } + } + } + } + self.projects.remove(self.selected_project); + let _ = self.main_tx.send(ToolMessage::Output(format!( + "{}-{} was sucessfully removed!", + project.org_name, project.name + ))); + } + } self.prompt.responses.clear(); - let _ = self.main_tx.send(ToolMessage::Output(format!( - "{}-{} was sucessfully removed!", - project.org_name, project.name - ))); } "remove_project" | "rp" => { let project = self.projects[self.selected_project].clone(); - if project.name == "default" && project.org_name == "default" { - let _ = self.main_tx.send(ToolMessage::Output( - "The default project must remain. Canceling.".to_string(), - )); - self.prompt.action = None; - } else { - self.prompt.action = Some(ToolMessage::RemoveProject); - let _ = self.main_tx.send(ToolMessage::Output(format!( - "{}, {} and all contents will be deleted. Continue? (y/N)", - project.files.display(), - project.notes.display() - ))); - } + self.prompt.action = Some(ToolMessage::RemoveProject); + self.prompt.num_responses = 1; + self.prompt.execute_command = String::from("remove_project_confirm"); + let _ = self.main_tx.send(ToolMessage::Output(format!( + "{}, {} and all contents will be deleted. Continue? (y/N)", + project.files.display(), + project.notes.display() + ))); } _ => { let ast = self @@ -926,7 +947,10 @@ impl DistroBox { } } +#[derive(Clone)] struct Prompt { action: Option, responses: Vec, + execute_command: String, + num_responses: usize, }