updated remove project logic to check if the client folders are empty,

and if they are deltes them.
This commit is contained in:
2026-05-21 13:51:04 -05:00
parent 9ddcd1ef6e
commit 95b86f80aa
2 changed files with 72 additions and 51 deletions
+8 -11
View File
@@ -226,17 +226,14 @@ pub fn run_tui(
state.output.push("\n".to_string()); state.output.push("\n".to_string());
state.output.push(format!("[user input] > {}", trimmed)); state.output.push(format!("[user input] > {}", trimmed));
state.output.push("\n".to_string()); state.output.push("\n".to_string());
if let Some(action) = state.prompt.action.clone() { let prompt = state.prompt.clone();
match action { if prompt.action.is_some() {
ToolMessage::RemoveProject => { state.prompt.responses.push(trimmed.clone());
if trimmed.to_lowercase().contains("y") { if state.prompt.responses.len() == state.prompt.num_responses {
state.execute_command( state.execute_command(
"remove_project_confirm", prompt.execute_command.as_str(),
None, None,
)?; )?;
}
}
_ => {}
} }
} }
let (command, args) = let (command, args) =
+64 -40
View File
@@ -3,7 +3,7 @@ use ratatui::crossterm::event;
use rhai::{AST, Dynamic, Engine, Scope}; use rhai::{AST, Dynamic, Engine, Scope};
use std::collections::HashMap; use std::collections::HashMap;
use std::error::Error; 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::io::{self, BufRead, BufReader, Write};
use std::path::PathBuf; use std::path::PathBuf;
use std::process::{Command, Stdio}; use std::process::{Command, Stdio};
@@ -57,6 +57,8 @@ impl AppState {
prompt: Prompt { prompt: Prompt {
action: None, action: None,
responses: Vec::new(), responses: Vec::new(),
execute_command: String::new(),
num_responses: 0,
}, },
}, },
main_rx, main_rx,
@@ -208,50 +210,69 @@ impl AppState {
self.promote_project()?; self.promote_project()?;
} }
"remove_project_confirm" => { "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.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(); self.prompt.responses.clear();
let _ = self.main_tx.send(ToolMessage::Output(format!(
"{}-{} was sucessfully removed!",
project.org_name, project.name
)));
} }
"remove_project" | "rp" => { "remove_project" | "rp" => {
let project = self.projects[self.selected_project].clone(); let project = self.projects[self.selected_project].clone();
if project.name == "default" && project.org_name == "default" { self.prompt.action = Some(ToolMessage::RemoveProject);
let _ = self.main_tx.send(ToolMessage::Output( self.prompt.num_responses = 1;
"The default project must remain. Canceling.".to_string(), self.prompt.execute_command = String::from("remove_project_confirm");
)); let _ = self.main_tx.send(ToolMessage::Output(format!(
self.prompt.action = None; "{}, {} and all contents will be deleted. Continue? (y/N)",
} else { project.files.display(),
self.prompt.action = Some(ToolMessage::RemoveProject); project.notes.display()
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 let ast = self
@@ -926,7 +947,10 @@ impl DistroBox {
} }
} }
#[derive(Clone)]
struct Prompt { struct Prompt {
action: Option<ToolMessage>, action: Option<ToolMessage>,
responses: Vec<String>, responses: Vec<String>,
execute_command: String,
num_responses: usize,
} }