flams_router_content/
backend.rs

1use ftml_uris::{DocumentUri, FtmlUri, Uri};
2
3pub struct FtmlBackend;
4impl ftml_backend::GlobalBackend for FtmlBackend {
5    type Error = <Self::Backend as ftml_backend::FtmlBackend>::Error; // TODO
6    #[cfg(feature = "ssr")]
7    type Backend = Self;
8    #[cfg(all(feature = "hydrate", not(feature = "ssr")))]
9    type Backend = ftml_backend::CachedBackend<Self>;
10    #[inline]
11    fn get() -> &'static Self::Backend {
12        #[cfg(feature = "ssr")]
13        static SLF: FtmlBackend = FtmlBackend;
14        #[cfg(all(feature = "hydrate", not(feature = "ssr")))]
15        static SLF: std::sync::LazyLock<ftml_backend::CachedBackend<FtmlBackend>> =
16            std::sync::LazyLock::new(|| ftml_backend::CachedBackend::new(FtmlBackend));
17        &SLF
18    }
19}
20impl ftml_backend::FlamsBackend for FtmlBackend {
21    #[inline]
22    fn stripped(&self) -> bool {
23        true
24    }
25    fn document_link_url(&self, uri: &ftml_uris::DocumentUri) -> String {
26        format!("/?uri={}", uri.url_encoded())
27    }
28    fn resource_link_url(
29        &self,
30        uri: &ftml_uris::DocumentUri,
31        kind: &'static str,
32    ) -> Option<String> {
33        Some(format!("/doc?uri={}&format={kind}", uri.url_encoded()))
34    }
35
36    fn get_fragment(
37        &self,
38        uri: Option<ftml_uris::Uri>,
39        rp: Option<String>,
40        a: Option<ftml_uris::ArchiveId>,
41        p: Option<String>,
42        d: Option<String>,
43        m: Option<String>,
44        l: Option<ftml_uris::Language>,
45        e: Option<String>,
46        s: Option<String>,
47        context: Option<ftml_uris::NarrativeUri>,
48    ) -> impl Future<
49        Output = Result<
50            (ftml_uris::Uri, Box<[ftml_ontology::utils::Css]>, Box<str>),
51            ftml_backend::BackendError<leptos::server_fn::error::ServerFnErrorErr>,
52        >,
53    > {
54        super::server_fns::fragment(uri, rp, a, p, d, m, l, e, s, context)
55    }
56
57    fn get_document_html(
58        &self,
59        uri: Option<ftml_uris::DocumentUri>,
60        rp: Option<String>,
61        a: Option<ftml_uris::ArchiveId>,
62        p: Option<String>,
63        d: Option<String>,
64        l: Option<ftml_uris::Language>,
65    ) -> impl Future<
66        Output = Result<
67            (DocumentUri, Box<[ftml_ontology::utils::Css]>, Box<str>),
68            ftml_backend::BackendError<leptos::server_fn::error::ServerFnErrorErr>,
69        >,
70    > + Send {
71        super::server_fns::document(uri, rp, a, p, d, l)
72    }
73
74    async fn get_toc(
75        &self,
76        uri: Option<DocumentUri>,
77        rp: Option<String>,
78        a: Option<ftml_uris::ArchiveId>,
79        p: Option<String>,
80        d: Option<String>,
81        l: Option<ftml_uris::Language>,
82    ) -> Result<
83        (
84            Box<[ftml_ontology::utils::Css]>,
85            Box<[ftml_ontology::narrative::documents::TocElem]>,
86        ),
87        ftml_backend::BackendError<leptos::server_fn::error::ServerFnErrorErr>,
88    > {
89        super::server_fns::toc(uri, rp, a, p, d, l)
90            .await
91            .map_err(|e| ftml_backend::BackendError::ToDo(e.to_string()))
92    }
93
94    fn get_module(
95        &self,
96        uri: Option<ftml_uris::ModuleUri>,
97        a: Option<ftml_uris::ArchiveId>,
98        p: Option<String>,
99        m: Option<String>,
100    ) -> impl Future<
101        Output = Result<
102            ftml_ontology::domain::modules::ModuleLike,
103            ftml_backend::BackendError<leptos::server_fn::error::ServerFnErrorErr>,
104        >,
105    > + Send {
106        super::server_fns::get_module(uri, a, p, m)
107    }
108
109    fn get_solutions(
110        &self,
111        uri: ftml_uris::DocumentElementUri,
112    ) -> impl Future<
113        Output = Result<
114            ftml_ontology::narrative::elements::problems::Solutions,
115            ftml_backend::BackendError<leptos::server_fn::error::ServerFnErrorErr>,
116        >,
117    > + Send {
118        async move {
119            let r = super::server_fns::solution(
120                Some(uri.into()),
121                None,
122                None,
123                None,
124                None,
125                None,
126                None,
127                None,
128                None,
129            )
130            .await
131            .map_err(|e| ftml_backend::BackendError::ToDo(e.to_string()))?;
132            ftml_ontology::narrative::elements::problems::Solutions::from_jstring(&r).ok_or_else(
133                || ftml_backend::BackendError::NotFound(ftml_uris::UriKind::DocumentElement),
134            )
135        }
136    }
137
138    fn get_document(
139        &self,
140        uri: Option<ftml_uris::DocumentUri>,
141        rp: Option<String>,
142        a: Option<ftml_uris::ArchiveId>,
143        p: Option<String>,
144        d: Option<String>,
145        l: Option<ftml_uris::Language>,
146    ) -> impl Future<
147        Output = Result<
148            ftml_ontology::narrative::documents::Document,
149            ftml_backend::BackendError<leptos::server_fn::error::ServerFnErrorErr>,
150        >,
151    > {
152        super::server_fns::get_document(uri, rp, a, p, d, l)
153    }
154
155    fn get_notations(
156        &self,
157        uri: Option<Uri>,
158        rp: Option<String>,
159        a: Option<ftml_uris::ArchiveId>,
160        p: Option<String>,
161        d: Option<String>,
162        m: Option<String>,
163        l: Option<ftml_uris::Language>,
164        e: Option<String>,
165        s: Option<String>,
166    ) -> impl Future<
167        Output = Result<
168            Vec<(
169                ftml_uris::DocumentElementUri,
170                ftml_ontology::narrative::elements::Notation,
171            )>,
172            ftml_backend::BackendError<leptos::server_fn::error::ServerFnErrorErr>,
173        >,
174    > + Send {
175        super::server_fns::notations(uri, rp, a, p, d, m, l, e, s)
176    }
177    fn get_logical_paragraphs(
178        &self,
179        uri: Option<ftml_uris::SymbolUri>,
180        a: Option<ftml_uris::ArchiveId>,
181        p: Option<String>,
182        m: Option<String>,
183        s: Option<String>,
184        problems: bool,
185    ) -> impl Future<
186        Output = Result<
187            Vec<(
188                ftml_uris::DocumentElementUri,
189                ftml_ontology::narrative::elements::ParagraphOrProblemKind,
190            )>,
191            ftml_backend::BackendError<leptos::server_fn::error::ServerFnErrorErr>,
192        >,
193    > + Send {
194        super::server_fns::los(uri, a, p, m, s, problems)
195    }
196}