use anyhow::{Context, Result};
use clap::Args;
use colored::*;
use qdrant_client::Qdrant;
use std::io::{self, Write}; use std::sync::Arc;
use crate::config::{AppConfig, RepositoryConfig}; use crate::cli::repo_commands::helpers::get_collection_name;
#[derive(Args, Debug)]
pub struct ClearArgs {
#[arg(long)]
repo_name: Option<String>,
#[arg(short, long)]
yes: bool,
}
pub async fn handle_clear(
args: &ClearArgs, config: AppConfig, client: Arc<Qdrant>, ) -> Result<()> {
let repo_to_clear: &RepositoryConfig = if let Some(ref name) = args.repo_name {
config.repositories.iter().find(|r| r.name == *name).ok_or_else(|| {
anyhow::anyhow!("Repository '{}' not found in configuration.", name)
})?
} else {
let active_repo_name = config.active_repository.as_ref().ok_or_else(|| {
anyhow::anyhow!("No repository specified with --repo-name and no active repository set. Use 'repo use <name>' first.")
})?;
config.repositories.iter().find(|r| r.name == *active_repo_name).ok_or_else(||{
anyhow::anyhow!("Active repository '{}' configured but not found in repository list.", active_repo_name)
})?
};
let target_repo_name = &repo_to_clear.name;
let collection_name = get_collection_name(target_repo_name);
log::info!("Preparing to clear data for repository: '{}', collection: '{}'", target_repo_name, collection_name);
if !args.yes {
print!(
"{}",
format!(
"Are you sure you want to delete ALL indexed data for repository '{}' (collection '{}')? [y/N]: ",
target_repo_name.yellow().bold(),
collection_name.yellow().bold()
)
.red()
);
io::stdout().flush().context("Failed to flush stdout")?;
let mut confirmation = String::new();
io::stdin()
.read_line(&mut confirmation)
.context("Failed to read confirmation line")?;
if confirmation.trim().to_lowercase() != "y" {
println!("Operation cancelled.");
return Ok(());
}
}
log::info!("Attempting to delete collection '{}'...", collection_name);
println!("Deleting collection '{}'...", collection_name);
match client.delete_collection(collection_name.clone()).await {
Ok(op_result) => {
if op_result.result {
println!(
"{}",
format!("Successfully deleted collection '{}'.", collection_name).green()
);
log::info!("Collection '{}' deleted successfully.", collection_name);
} else {
println!(
"{}",
format!("Collection '{}' might not have existed or deletion failed server-side.", collection_name).yellow()
);
log::warn!("Delete operation for collection '{}' returned false.", collection_name);
}
}
Err(e) => {
if e.to_string().contains("Not found") || e.to_string().contains("doesn\'t exist") {
println!(
"{}",
format!("Collection '{}' did not exist.", collection_name).yellow()
);
log::warn!("Collection '{}' not found during delete attempt.", collection_name);
} else {
eprintln!(
"{}",
format!("Failed to delete collection '{}': {}", collection_name, e).red()
);
return Err(e).context(format!("Failed to delete collection '{}'", collection_name));
}
}
}
Ok(())
}