Skip to main content

molframe_spatial/planning/resolver/
dispatch.rs

1//! Query-language request dispatch for a structure-bound spatial resolver.
2
3use super::StructureSpatial;
4use super::matching::{resolve_beyond_request, resolve_within_request};
5use molframe_core::diagnostic::{Code, Diagnostic};
6use molframe_core::selection::AtomSelection;
7use molframe_query::{GeometricRequest, SpatialResolver};
8
9impl SpatialResolver for StructureSpatial<'_> {
10    /// Resolves one query-language geometric request.
11    ///
12    /// Each variant delegates to a focused helper to keep dispatch separate
13    /// from individual spatial algorithms.
14    fn resolve(&self, request: GeometricRequest<'_>) -> Result<AtomSelection, Diagnostic> {
15        match request {
16            GeometricRequest::Within {
17                universe,
18                target,
19                radius,
20                include_target,
21            } => resolve_within_request(self, universe, target, radius, include_target),
22            GeometricRequest::Beyond {
23                universe,
24                target,
25                radius,
26            } => resolve_beyond_request(self, universe, target, radius),
27            GeometricRequest::SphereZone {
28                universe,
29                target,
30                radius,
31            } => self.radial_from_target(universe, target, 0.0, radius, None),
32            GeometricRequest::SphereLayer {
33                universe,
34                target,
35                inner,
36                outer,
37            } => self.radial_from_target(universe, target, inner, outer, None),
38            GeometricRequest::IsoLayer {
39                universe,
40                target,
41                inner,
42                outer,
43            } => self.iso_layer(universe, target, inner, outer),
44            GeometricRequest::CylinderZone {
45                universe,
46                target,
47                radius,
48                z_max,
49                z_min,
50            } => self.radial_from_target(universe, target, 0.0, radius, Some((z_min, z_max))),
51            GeometricRequest::CylinderLayer {
52                universe,
53                target,
54                inner,
55                outer,
56                z_max,
57                z_min,
58            } => self.radial_from_target(universe, target, inner, outer, Some((z_min, z_max))),
59            GeometricRequest::Point {
60                universe,
61                point,
62                radius,
63            } => self.radial(universe, point, 0.0, radius, None),
64            _ => Err(Diagnostic::new(Code::E9001)),
65        }
66    }
67}