flams_router_search/
lib.rs

1#![recursion_limit = "256"]
2
3#[cfg(any(
4    all(feature = "ssr", feature = "hydrate", not(feature = "docs-only")),
5    not(any(feature = "ssr", feature = "hydrate"))
6))]
7compile_error!("exactly one of the features \"ssr\" or \"hydrate\" must be enabled");
8
9pub mod components;
10pub mod vscode;
11
12use flams_ontology::{
13    search::{QueryFilter, SearchResult},
14    uris::SymbolURI,
15};
16use flams_utils::vecmap::VecMap;
17use leptos::prelude::*;
18
19#[server(prefix = "/api", endpoint = "search")]
20#[allow(clippy::unused_async)]
21pub async fn search_query(
22    query: String,
23    opts: QueryFilter,
24    num_results: usize,
25) -> Result<Vec<(f32, SearchResult)>, ServerFnError<String>> {
26    use flams_system::search::Searcher;
27    tokio::task::spawn_blocking(move || {
28        Searcher::get()
29            .query(&query, opts, num_results)
30            .ok_or_else(|| ServerFnError::ServerError("Search error".to_string()))
31    })
32    .await
33    .map_err(|e| ServerFnError::ServerError(e.to_string()))?
34}
35#[server(prefix = "/api", endpoint = "search_symbols")]
36#[allow(clippy::unused_async)]
37pub async fn search_symbols(
38    query: String,
39    num_results: usize,
40) -> Result<VecMap<SymbolURI, Vec<(f32, SearchResult)>>, ServerFnError<String>> {
41    use flams_system::search::Searcher;
42    tokio::task::spawn_blocking(move || {
43        Searcher::get()
44            .query_symbols(&query, num_results)
45            .ok_or_else(|| ServerFnError::ServerError("Search error".to_string()))
46    })
47    .await
48    .map_err(|e| ServerFnError::ServerError(e.to_string()))?
49}