1use crate::value::Value;
15
16#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
22pub struct NodeId(pub u64);
23
24pub trait AstAdapter {
31 fn root(&self) -> NodeId;
33
34 fn children(&self, node: NodeId) -> Vec<NodeId>;
38
39 fn name(&self, node: NodeId) -> Option<String>;
44
45 fn parent(&self, _node: NodeId) -> Option<NodeId> {
47 None
48 }
49
50 fn traits(&self, _node: NodeId) -> Vec<String> {
54 Vec::new()
55 }
56
57 fn property(&self, _node: NodeId, _name: &str) -> Option<Value> {
59 None
60 }
61
62 fn children_named(&self, node: NodeId, name: &str) -> Vec<NodeId> {
73 self.children(node)
74 .into_iter()
75 .filter(|&c| self.name(c).as_deref() == Some(name))
76 .collect()
77 }
78
79 fn default_value(&self, _node: NodeId) -> Option<Value> {
82 None
83 }
84
85 fn metadata(&self, _node: NodeId, _key: &str) -> Option<Value> {
88 None
89 }
90
91 fn links(&self, _node: NodeId) -> Vec<(String, NodeId)> {
94 Vec::new()
95 }
96
97 fn backlinks(&self, _node: NodeId) -> Vec<(String, NodeId)> {
101 Vec::new()
102 }
103
104 fn resolve(&self, _node: NodeId, _property: &str, _hint: Option<&str>) -> Option<NodeId> {
109 None
110 }
111
112 fn link_property(
119 &self,
120 _source: NodeId,
121 _label: &str,
122 _target: NodeId,
123 _name: &str,
124 ) -> Option<Value> {
125 None
126 }
127
128 fn quantifier_bound(&self) -> usize {
134 32
135 }
136
137 fn allow_shell(&self) -> bool {
142 false
143 }
144
145 fn invocation_instant(&self) -> Option<(i64, u32)> {
153 None
154 }
155
156 fn unit_scale(&self, expr: &str) -> Option<(f64, String)> {
164 crate::quantity::scale_expr(expr)
165 }
166}
167
168pub struct QuantifierBound<'a, A: AstAdapter> {
172 pub inner: &'a A,
173 pub bound: usize,
174}
175
176impl<A: AstAdapter> AstAdapter for QuantifierBound<'_, A> {
177 fn root(&self) -> NodeId {
178 self.inner.root()
179 }
180 fn children(&self, node: NodeId) -> Vec<NodeId> {
181 self.inner.children(node)
182 }
183 fn name(&self, node: NodeId) -> Option<String> {
184 self.inner.name(node)
185 }
186 fn parent(&self, node: NodeId) -> Option<NodeId> {
187 self.inner.parent(node)
188 }
189 fn traits(&self, node: NodeId) -> Vec<String> {
190 self.inner.traits(node)
191 }
192 fn property(&self, node: NodeId, name: &str) -> Option<Value> {
193 self.inner.property(node, name)
194 }
195 fn children_named(&self, node: NodeId, name: &str) -> Vec<NodeId> {
196 self.inner.children_named(node, name)
197 }
198 fn default_value(&self, node: NodeId) -> Option<Value> {
199 self.inner.default_value(node)
200 }
201 fn metadata(&self, node: NodeId, key: &str) -> Option<Value> {
202 self.inner.metadata(node, key)
203 }
204 fn links(&self, node: NodeId) -> Vec<(String, NodeId)> {
205 self.inner.links(node)
206 }
207 fn backlinks(&self, node: NodeId) -> Vec<(String, NodeId)> {
208 self.inner.backlinks(node)
209 }
210 fn resolve(&self, node: NodeId, property: &str, hint: Option<&str>) -> Option<NodeId> {
211 self.inner.resolve(node, property, hint)
212 }
213 fn link_property(
214 &self,
215 source: NodeId,
216 label: &str,
217 target: NodeId,
218 name: &str,
219 ) -> Option<Value> {
220 self.inner.link_property(source, label, target, name)
221 }
222 fn quantifier_bound(&self) -> usize {
223 self.bound
224 }
225 fn allow_shell(&self) -> bool {
226 self.inner.allow_shell()
227 }
228 fn invocation_instant(&self) -> Option<(i64, u32)> {
229 self.inner.invocation_instant()
230 }
231 fn unit_scale(&self, expr: &str) -> Option<(f64, String)> {
232 self.inner.unit_scale(expr)
233 }
234}
235
236pub struct AllowShell<'a, A: AstAdapter> {
240 pub inner: &'a A,
241}
242
243impl<A: AstAdapter> AstAdapter for AllowShell<'_, A> {
244 fn root(&self) -> NodeId {
245 self.inner.root()
246 }
247 fn children(&self, node: NodeId) -> Vec<NodeId> {
248 self.inner.children(node)
249 }
250 fn name(&self, node: NodeId) -> Option<String> {
251 self.inner.name(node)
252 }
253 fn parent(&self, node: NodeId) -> Option<NodeId> {
254 self.inner.parent(node)
255 }
256 fn traits(&self, node: NodeId) -> Vec<String> {
257 self.inner.traits(node)
258 }
259 fn property(&self, node: NodeId, name: &str) -> Option<Value> {
260 self.inner.property(node, name)
261 }
262 fn children_named(&self, node: NodeId, name: &str) -> Vec<NodeId> {
263 self.inner.children_named(node, name)
264 }
265 fn default_value(&self, node: NodeId) -> Option<Value> {
266 self.inner.default_value(node)
267 }
268 fn metadata(&self, node: NodeId, key: &str) -> Option<Value> {
269 self.inner.metadata(node, key)
270 }
271 fn links(&self, node: NodeId) -> Vec<(String, NodeId)> {
272 self.inner.links(node)
273 }
274 fn backlinks(&self, node: NodeId) -> Vec<(String, NodeId)> {
275 self.inner.backlinks(node)
276 }
277 fn resolve(&self, node: NodeId, property: &str, hint: Option<&str>) -> Option<NodeId> {
278 self.inner.resolve(node, property, hint)
279 }
280 fn link_property(
281 &self,
282 source: NodeId,
283 label: &str,
284 target: NodeId,
285 name: &str,
286 ) -> Option<Value> {
287 self.inner.link_property(source, label, target, name)
288 }
289 fn quantifier_bound(&self) -> usize {
290 self.inner.quantifier_bound()
291 }
292 fn allow_shell(&self) -> bool {
293 true
294 }
295 fn invocation_instant(&self) -> Option<(i64, u32)> {
296 self.inner.invocation_instant()
297 }
298 fn unit_scale(&self, expr: &str) -> Option<(f64, String)> {
299 self.inner.unit_scale(expr)
300 }
301}
302
303pub struct WithNow<'a, A: AstAdapter> {
307 pub inner: &'a A,
308 pub secs: i64,
309 pub nanos: u32,
310}
311
312impl<A: AstAdapter> AstAdapter for WithNow<'_, A> {
313 fn root(&self) -> NodeId {
314 self.inner.root()
315 }
316 fn children(&self, node: NodeId) -> Vec<NodeId> {
317 self.inner.children(node)
318 }
319 fn name(&self, node: NodeId) -> Option<String> {
320 self.inner.name(node)
321 }
322 fn parent(&self, node: NodeId) -> Option<NodeId> {
323 self.inner.parent(node)
324 }
325 fn traits(&self, node: NodeId) -> Vec<String> {
326 self.inner.traits(node)
327 }
328 fn property(&self, node: NodeId, name: &str) -> Option<Value> {
329 self.inner.property(node, name)
330 }
331 fn children_named(&self, node: NodeId, name: &str) -> Vec<NodeId> {
332 self.inner.children_named(node, name)
333 }
334 fn default_value(&self, node: NodeId) -> Option<Value> {
335 self.inner.default_value(node)
336 }
337 fn metadata(&self, node: NodeId, key: &str) -> Option<Value> {
338 self.inner.metadata(node, key)
339 }
340 fn links(&self, node: NodeId) -> Vec<(String, NodeId)> {
341 self.inner.links(node)
342 }
343 fn backlinks(&self, node: NodeId) -> Vec<(String, NodeId)> {
344 self.inner.backlinks(node)
345 }
346 fn resolve(&self, node: NodeId, property: &str, hint: Option<&str>) -> Option<NodeId> {
347 self.inner.resolve(node, property, hint)
348 }
349 fn link_property(
350 &self,
351 source: NodeId,
352 label: &str,
353 target: NodeId,
354 name: &str,
355 ) -> Option<Value> {
356 self.inner.link_property(source, label, target, name)
357 }
358 fn quantifier_bound(&self) -> usize {
359 self.inner.quantifier_bound()
360 }
361 fn allow_shell(&self) -> bool {
362 self.inner.allow_shell()
363 }
364 fn invocation_instant(&self) -> Option<(i64, u32)> {
365 Some((self.secs, self.nanos))
366 }
367 fn unit_scale(&self, expr: &str) -> Option<(f64, String)> {
368 self.inner.unit_scale(expr)
369 }
370}