Skip to main content

flams_router_vscode/
checks.rs

1use flams_router_base::maybe_lazy;
2use flams_router_content::checks::ResultExt;
3use ftml_dom::TermTrackedViews;
4use leptos::prelude::*;
5
6maybe_lazy!(
7    Checks = {
8        // make sure this runs client side rather than server side because of hydration errors
9        // I don't understand.
10        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}