Skip to main content

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::{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        // throws errors if I label it mut in the signature, for some reason
28        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}