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_backend_types::search::{QueryFilter, SearchResult};
13use flams_utils::vecmap::VecMap;
14use ftml_uris::SymbolUri;
15use leptos::prelude::*;
16
17#[server(prefix = "/api", endpoint = "search")]
18#[allow(clippy::unused_async)]
19pub async fn search_query(
20    query: String,
21    opts: QueryFilter,
22    num_results: usize,
23) -> Result<Vec<(f32, SearchResult)>, ServerFnError<String>> {
24    use flams_search::Searcher;
25    tokio::task::spawn_blocking(move || {
26        Searcher::get()
27            .query(&query, opts, num_results)
28            .ok_or_else(|| ServerFnError::ServerError("Search error".to_string()))
29    })
30    .await
31    .map_err(|e| ServerFnError::ServerError(e.to_string()))?
32}
33#[server(prefix = "/api", endpoint = "search_symbols")]
34#[allow(clippy::unused_async)]
35pub async fn search_symbols(
36    query: String,
37    num_results: usize,
38) -> Result<Vec<(SymbolUri, Vec<(f32, SearchResult)>)>, ServerFnError<String>> {
39    use flams_search::Searcher;
40    tokio::task::spawn_blocking(move || {
41        Searcher::get()
42            .query_symbols(&query, num_results)
43            .ok_or_else(|| ServerFnError::ServerError("Search error".to_string()))
44    })
45    .await
46    .map_err(|e| ServerFnError::ServerError(e.to_string()))?
47}