morph-cli 0.1.0

AST-based codebase migration and codemod tool for JavaScript and TypeScript projects.
Documentation
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();

        // 1. Category filter
        if let Some(cat) = category_filter {
            if metadata.category.to_string().to_lowercase() != cat.to_lowercase() {
                continue;
            }
        }

        // 2. Maturity filter
        if let Some(mat) = maturity_filter {
            if metadata.maturity.to_string().to_lowercase() != mat.to_lowercase() {
                continue;
            }
        }

        // 3. Search query matching
        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(())
}