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; #[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}