Skip to main content

qualia_core_db/domains/geospatial/adapters/
astrometry_adapter.rs

1use crate::domains::geospatial::adapters::{AdapterHttpRequest, DataAdapter};
2use crate::net::disclosure::NetworkDisclosureRegistry;
3
4/// Adapter for Trajectory & Ephemeris REST APIs (e.g., NASA JPL Horizons, NeoWs, MPC).
5pub struct AstrometryAdapter {
6    pub id: &'static str,
7    pub endpoint: String,
8}
9
10impl AstrometryAdapter {
11    pub fn new(id: &'static str, endpoint: &str) -> Self {
12        Self {
13            id,
14            endpoint: endpoint.to_string(),
15        }
16    }
17}
18
19impl DataAdapter for AstrometryAdapter {
20    fn adapter_id(&self) -> &'static str {
21        self.id
22    }
23
24    fn build_fetch_request(
25        &self,
26        _bbox: (f64, f64, f64, f64),
27        time_range: (u64, u64),
28        registry: &NetworkDisclosureRegistry,
29    ) -> Result<AdapterHttpRequest, String> {
30        if !registry.check_egress_consent(self.adapter_id(), &self.endpoint) {
31            return Err(format!(
32                "Consent denied or unregistered for astrometry endpoint {}",
33                self.endpoint
34            ));
35        }
36
37        let url = format!(
38            "{}?format=json&START_TIME={}&STOP_TIME={}",
39            self.endpoint, time_range.0, time_range.1
40        );
41
42        Ok(AdapterHttpRequest::get(url, "Astrometry"))
43    }
44
45    fn primary_endpoint(&self) -> &str {
46        &self.endpoint
47    }
48
49    fn estimate_tile_count(&self, _bbox: (f64, f64, f64, f64)) -> u32 {
50        1
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57
58    #[test]
59    fn test_astrometry_adapter_consent_denied() {
60        let registry = NetworkDisclosureRegistry::new();
61        let adapter = AstrometryAdapter::new(
62            "astrometry_adapter",
63            "https://ssd.jpl.nasa.gov/api/horizons.api",
64        );
65
66        let res = adapter.fetch_region((0.0, 0.0, 1.0, 1.0), (0, 0), &registry);
67        assert!(res.is_err());
68    }
69}