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
+5 -8
View File
@@ -226,19 +226,16 @@ 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") {
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(
"remove_project_confirm",
prompt.execute_command.as_str(),
None,
)?;
}
}
_ => {}
}
}
let (command, args) =
trimmed.split_once(' ').unwrap_or((&trimmed, ""));
match command {
+34 -10
View File
@@ -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,6 +210,10 @@ impl AppState {
self.promote_project()?;
}
"remove_project_confirm" => {
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();
@@ -222,37 +228,52 @@ impl AppState {
"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);
self.prompt.action = None;
self.prompt.responses.clear();
let _ = self.main_tx.send(ToolMessage::Output(format!(
"{}-{} was sucessfully removed!",
project.org_name, project.name
)));
}
}
self.prompt.responses.clear();
}
"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);
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
.module_loader
@@ -926,7 +947,10 @@ impl DistroBox {
}
}
#[derive(Clone)]
struct Prompt {
action: Option<ToolMessage>,
responses: Vec<String>,
execute_command: String,
num_responses: usize,
}