pub mod ast_pattern;
pub mod fusion;
pub mod semantic;
pub mod text;
use crate::parser::CodeChunk;
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum SearchMode {
Text,
Semantic,
Ast,
Hybrid,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct SearchQuery {
pub query: String,
pub mode: SearchMode,
pub top_k: usize,
pub project_path: String,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct SearchResult {
pub chunk: CodeChunk,
pub score: f32,
pub source: SearchMode,
pub matched_lines: Vec<usize>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct SearchResponse {
pub results: Vec<SearchResult>,
pub total: usize,
pub duration_ms: u64,
pub query: SearchQuery,
}
impl std::fmt::Display for SearchMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
SearchMode::Text => write!(f, "text"),
SearchMode::Semantic => write!(f, "semantic"),
SearchMode::Ast => write!(f, "ast"),
SearchMode::Hybrid => write!(f, "hybrid"),
}
}
}
impl std::str::FromStr for SearchMode {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_lowercase().as_str() {
"text" => Ok(SearchMode::Text),
"semantic" => Ok(SearchMode::Semantic),
"ast" => Ok(SearchMode::Ast),
"hybrid" => Ok(SearchMode::Hybrid),
_ => Err(format!(
"Unknown search mode: '{}'. Use: text, semantic, ast, hybrid",
s
)),
}
}
}