opengrep 1.1.0

Advanced AST-aware code search tool with tree-sitter parsing and AI integration capabilities
Documentation
//! Basic usage example for OpenGrep
//! 
//! This example demonstrates how to use OpenGrep as a library
//! for programmatic code searching.

use opengrep::{Config, SearchEngine};
use std::path::PathBuf;
use tokio;

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    // Initialize logging
    opengrep::init_logging(1)?;
    
    // Create default configuration
    let mut config = Config::default();
    config.search.threads = 4;
    config.output.show_ast_context = true;
    config.output.before_context = 1;
    config.output.after_context = 1;
    
    // Create search engine
    let engine = SearchEngine::new(config);
    
    // Search for "fn" in the current directory
    println!("Searching for 'fn' patterns...");
    let results = engine.search("fn", &[PathBuf::from(".")]).await?;
    
    // Display results
    println!("\nSearch Results:");
    println!("==================");
    println!("Files with matches: {}", results.len());
    
    let total_matches: usize = results.iter().map(|r| r.matches.len()).sum();
    println!("Total matches: {}", total_matches);
    
    // Show first few results
    for (i, result) in results.iter().take(3).enumerate() {
        println!("\n{}. {} ({} matches)", 
                 i + 1, 
                 result.path.display(), 
                 result.matches.len());
        
        // Show first match in each file
        if let Some(first_match) = result.matches.first() {
            println!("   Line {}: {}", 
                     first_match.line_number, 
                     first_match.line_text.trim());
        }
    }
    
    if results.len() > 3 {
        println!("\n... and {} more files", results.len() - 3);
    }
    
    println!("\nSearch completed successfully!");
    
    Ok(())
}