use agcodex_core::tools::GrepConfig;
use agcodex_core::tools::GrepQuery;
use agcodex_core::tools::GrepSupportedLanguage;
use agcodex_core::tools::GrepTool;
use std::io::Write;
use tempfile::NamedTempFile;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut temp_file = NamedTempFile::new()?;
writeln!(
temp_file,
r#"
pub struct User {{
pub id: u64,
name: String,
}}
impl User {{
pub fn new(id: u64, name: String) -> Self {{
User {{ id, name }}
}}
pub fn get_name(&self) -> &str {{
&self.name
}}
fn calculate_score(&self) -> i32 {{
42
}}
}}
fn main() {{
let user = User::new(1, "Alice".to_string());
println!("User: {{}}", user.get_name());
}}
"#
)?;
let file_path = temp_file.path().to_path_buf();
let grep_tool = GrepTool::new(GrepConfig::default());
println!("🔍 AST-Grep Tool Demo\n");
println!("📌 Demo 1: Simple Pattern Search");
println!("Searching for 'User' patterns...\n");
let query = GrepQuery {
pattern: "User".to_string(),
paths: vec![file_path.clone()],
language: Some(GrepSupportedLanguage::Rust),
context_lines: 0,
max_results: None,
..Default::default()
};
let result = grep_tool.search_with_query(query)?;
println!("Found {} matches", result.result.len());
for (i, grep_match) in result.result.iter().enumerate() {
println!(
" {}. {}:{}: User (confidence: {:.2})",
i + 1,
grep_match.file.file_name().unwrap().to_string_lossy(),
grep_match.line, grep_match.confidence
);
}
println!("\n📌 Demo 2: Advanced Query with Context");
println!("Searching for function declarations with context...\n");
let query = GrepQuery {
pattern: "fn".to_string(),
paths: vec![file_path.clone()],
language: Some(GrepSupportedLanguage::Rust),
context_lines: 3,
max_results: Some(3),
..Default::default()
};
let result = grep_tool.search_with_query(query)?;
println!("Advanced search summary: {}", result.summary);
for grep_match in &result.result {
println!(
"\n🎯 Match in {}:{}",
grep_match.file.file_name().unwrap().to_string_lossy(),
grep_match.line
);
println!(" Pattern match found");
}
println!("\n📌 Demo 3: YAML Rule Support");
println!("Note: This demonstrates the YAML rule interface (simplified example)\n");
let yaml_rule = r#"
id: find-public-functions
message: Found public function
severity: info
language: rust
rule:
pattern: pub fn $NAME($$$ARGS) { $$$BODY }
"#;
println!("YAML Rule:");
println!("{}", yaml_rule);
println!("This rule would find all public functions with meta-variable bindings for:");
println!(" - $NAME: function name");
println!(" - $ARGS: function arguments");
println!(" - $BODY: function body");
println!("\n📌 Demo 4: Performance");
println!("Pattern matching is optimized with internal caching.");
println!("Multiple searches benefit from pattern reuse.");
println!("\n📌 Demo 5: Multi-Language Support");
println!("Supported languages:");
let languages = [
"Rust",
"Python",
"JavaScript",
"TypeScript",
"Go",
"Java",
"C",
"C++",
"C#",
"HTML",
"CSS",
"JSON",
"YAML",
"Bash",
"PHP",
"Ruby",
"Swift",
"Kotlin",
];
for (i, lang) in languages.iter().enumerate() {
if i % 6 == 0 && i > 0 {
println!();
}
print!(" {:12}", lang);
}
println!("\n");
println!("✅ Demo completed successfully!");
println!("\nKey Features Demonstrated:");
println!(" • AST-aware pattern matching");
println!(" • Semantic context extraction");
println!(" • Meta-variable bindings");
println!(" • Confidence scoring");
println!(" • Pattern caching for performance");
println!(" • YAML rule support interface");
println!(" • Multi-language detection");
println!(" • Context-aware output for LLMs");
Ok(())
}