use crate::search::core::search_code as search_code_impl;
use crate::traits::SearchEngine;
use crate::types::{SearchOptions, SearchResult};
use std::path::Path;
#[derive(Debug, Clone, Default)]
pub struct DefaultSearchEngine;
impl DefaultSearchEngine {
pub fn new() -> Self {
Self
}
}
impl SearchEngine for DefaultSearchEngine {
fn search(
&self,
query: &str,
path: &Path,
options: &SearchOptions,
) -> Result<Vec<SearchResult>, Box<dyn std::error::Error>> {
search_code_impl(query, path, options)
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::fs;
use tempfile::tempdir;
#[test]
fn test_default_search_engine() {
let engine = DefaultSearchEngine::new();
let dir = tempdir().unwrap();
fs::write(dir.path().join("test.rs"), "fn test() {}").unwrap();
let options = SearchOptions {
extensions: Some(vec!["rs".to_string()]),
ignore_case: true,
..Default::default()
};
let result = engine.search("test", dir.path(), &options);
assert!(result.is_ok());
let results = result.unwrap();
assert!(!results.is_empty());
}
#[test]
fn test_search_engine_trait_object() {
let engine: Box<dyn SearchEngine> = Box::new(DefaultSearchEngine::new());
let dir = tempdir().unwrap();
fs::write(dir.path().join("test.rs"), "fn main() {}").unwrap();
let options = SearchOptions::default();
let result = engine.search("main", dir.path(), &options);
assert!(result.is_ok());
}
}