flams_router_vscode/
checks.rs1use flams_router_base::maybe_lazy;
2use flams_router_content::checks::ResultExt;
3use ftml_dom::TermTrackedViews;
4use leptos::prelude::*;
5
6maybe_lazy!(
7 Checks = {
8 let sig = RwSignal::new(false);
11 Effect::new(move || {
12 #[cfg(feature = "hydrate")]
13 {
14 sig.set(true);
15 }
16 });
17 let inner = move || {
18 let url = leptos_router::hooks::use_query_map()
19 .with_untracked(|q| q.get("url"))
20 .and_then(|s| s.parse().ok());
21 url.map(checks)
22 };
23
24 (move || if sig.get() { Some(inner()) } else { None }).into_any()
25 }
26);
27
28fn checks(url: url::Url) -> impl IntoView {
29 use ftml_component_utils::Spinner;
30 let check = Resource::new(move || url.clone(), get_check);
31 view! {<Suspense fallback = || view!(<Spinner/>)>{move ||
32 match check.get().map(|s| s.map(|s| s.map(|s| ftml_solver_trace::results::DocumentCheckResult::from_json(&s)))) {
33 Some(Ok(Some(Ok(v)))) => Some(flams_router_content::Views::top(move || v.render())),
34 _ => None
35 }
36 }</Suspense>}
37}
38
39#[allow(clippy::unused_async)]
40#[server(prefix = "/api", endpoint = "checks")]
41pub async fn get_check(url: url::Url) -> Result<Option<String>, ServerFnError<String>> {
42 let Some(state) = flams_lsp::STDIOLSPServer::global_state() else {
43 return Ok(None);
44 };
45 let Some(doc) = state.get(&url.into()) else {
46 return Ok(None);
47 };
48 let ret = doc.annotations.lock().check.as_ref().map(|j| j.to_json());
49 Ok(ret)
50}