1pub mod ast_pattern;
7pub mod fusion;
8pub mod semantic;
9pub mod text;
10
11use crate::parser::CodeChunk;
12
13#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
15#[serde(rename_all = "lowercase")]
16pub enum SearchMode {
17 Text,
19 Semantic,
21 Ast,
23 Hybrid,
25}
26
27#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
29pub struct SearchQuery {
30 pub query: String,
32
33 pub mode: SearchMode,
35
36 pub top_k: usize,
38
39 pub project_path: String,
41}
42
43#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
45pub struct SearchResult {
46 pub chunk: CodeChunk,
48
49 pub score: f32,
51
52 pub source: SearchMode,
54
55 pub matched_lines: Vec<usize>,
57}
58
59#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
61pub struct SearchResponse {
62 pub results: Vec<SearchResult>,
64
65 pub total: usize,
67
68 pub duration_ms: u64,
70
71 pub query: SearchQuery,
73}
74
75impl std::fmt::Display for SearchMode {
76 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
77 match self {
78 SearchMode::Text => write!(f, "text"),
79 SearchMode::Semantic => write!(f, "semantic"),
80 SearchMode::Ast => write!(f, "ast"),
81 SearchMode::Hybrid => write!(f, "hybrid"),
82 }
83 }
84}
85
86impl std::str::FromStr for SearchMode {
87 type Err = String;
88
89 fn from_str(s: &str) -> Result<Self, Self::Err> {
90 match s.to_lowercase().as_str() {
91 "text" => Ok(SearchMode::Text),
92 "semantic" => Ok(SearchMode::Semantic),
93 "ast" => Ok(SearchMode::Ast),
94 "hybrid" => Ok(SearchMode::Hybrid),
95 _ => Err(format!(
96 "Unknown search mode: '{}'. Use: text, semantic, ast, hybrid",
97 s
98 )),
99 }
100 }
101}