Skip to main content

Mountain/IPC/WindAirCommands/
SearchFiles.rs

1
2//! `SearchFiles` Tauri command - query Air's full-text index
3//! and shape hits into `SearchResultsDTO::Struct`.
4
5use crate::{
6	IPC::WindAirCommands::{FileResultDTO, GetAirAddress, GetOrCreateAirClient, SearchResultsDTO},
7	dev_log,
8};
9
10#[tauri::command]
11pub async fn SearchFiles(
12	query:String,
13
14	file_patterns:Vec<String>,
15
16	max_results:Option<u32>,
17) -> Result<SearchResultsDTO::Struct, String> {
18	dev_log!(
19		"grpc",
20		"[WindAirCommands] SearchFiles called: query={}, patterns={:?}",
21		query,
22		file_patterns
23	);
24
25	let air_address = GetAirAddress::Fn()?;
26
27	let client = GetOrCreateAirClient::Fn(air_address).await?;
28
29	let request_id = uuid::Uuid::new_v4().to_string();
30
31	let max_results_count = max_results.unwrap_or(100);
32
33	let search_results = client
34		.search_files(
35			request_id,
36			query,
37			file_patterns.first().map(|s| s.as_str()).unwrap_or("").to_string(),
38			max_results_count,
39		)
40		.await
41		.map_err(|e| format!("File search failed: {:?}", e))?;
42
43	let results:Vec<FileResultDTO::Struct> = search_results
44		.into_iter()
45		.map(|r| {
46			FileResultDTO::Struct {
47				path:r.path,
48				size:r.size,
49				line:Some(r.line_number),
50				content:Some(r.match_preview),
51			}
52		})
53		.collect();
54
55	let total_results = results.len() as u32;
56
57	let result = SearchResultsDTO::Struct { results, total_results };
58
59	dev_log!(
60		"grpc",
61		"[WindAirCommands] File search completed: {} results",
62		result.total_results
63	);
64
65	Ok(result)
66}