flams_router_search/
lib.rs1#![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::{FragmentQueryFilter, SearchResult};
13use ftml_uris::DocumentElementUri;
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: FragmentQueryFilter,
22 num_results: usize,
23) -> Result<Vec<(f32, SearchResult)>, ServerFnError<String>> {
24 use flams_math_archives::backend::LocalBackend;
25 use flams_search::Searcher;
26 tokio::task::spawn_blocking(move || {
27 let mut opts = opts;
29 opts.close(|u| flams_system::backend::backend().get_document(u).ok());
30 Searcher::get()
31 .query(&query, opts, num_results)
32 .ok_or_else(|| ServerFnError::ServerError("Search error".to_string()))
33 })
34 .await
35 .map_err(|e| ServerFnError::ServerError(e.to_string()))?
36}
37
38#[server(prefix = "/api", endpoint = "search_symbols")]
39#[allow(clippy::unused_async)]
40pub async fn search_symbols(
41 query: String,
42 num_results: usize,
43) -> Result<Vec<(f32, SymbolUri, DocumentElementUri)>, ServerFnError<String>> {
44 use flams_search::Searcher;
45 tokio::task::spawn_blocking(move || {
46 Searcher::get()
47 .query_symbols(&query, num_results)
48 .unwrap_or_default()
49 })
50 .await
51 .map_err(|e| ServerFnError::ServerError(e.to_string()))
52}