Skip to main content

Mountain/IPC/WindAirCommands/
SearchFiles.rs

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