Skip to main content

DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/IPC/WindAirCommands/
SearchFiles.rs

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