use std::path::Path;
use anyhow::Result;
use crate::core::registry::RecipeRegistry;
use crate::utils::terminal;
pub fn execute(query: &str, path: &Path, category_filter: Option<&str>, maturity_filter: Option<&str>) -> Result<()> {
let mut registry = RecipeRegistry::new();
registry.load_plugins(path);
let query_lower = query.to_lowercase();
let mut matches = Vec::new();
for recipe in registry.all() {
let metadata = recipe.metadata();
if let Some(cat) = category_filter {
if metadata.category.to_string().to_lowercase() != cat.to_lowercase() {
continue;
}
}
if let Some(mat) = maturity_filter {
if metadata.maturity.to_string().to_lowercase() != mat.to_lowercase() {
continue;
}
}
let matches_name = metadata.name.to_lowercase().contains(&query_lower);
let matches_desc = metadata.description.to_lowercase().contains(&query_lower);
let matches_cat = metadata.category.to_string().to_lowercase().contains(&query_lower);
let matches_tag = metadata.tags.iter().any(|t| t.to_lowercase().contains(&query_lower));
if matches_name || matches_desc || matches_cat || matches_tag {
matches.push(metadata);
}
}
println!();
println!("{} Search Results for '{}':", terminal::success_prefix(), query);
println!("{}", terminal::label("─".repeat(50).as_str()));
if matches.is_empty() {
println!(" No matching recipes found.");
return Ok(());
}
for metadata in matches {
println!(
" {} {} [{}] [category: {}]",
terminal::bullet(),
terminal::label(metadata.name),
metadata.maturity,
metadata.category
);
println!(" {}", metadata.description);
if !metadata.tags.is_empty() {
println!(" Tags: {}", metadata.tags.join(", "));
}
println!();
}
Ok(())
}