Skip to main content

pleiades_backend/
lib.rs

1//! Backend contracts, metadata, and adapter helpers for ephemeris providers.
2//!
3//! This crate defines the shared request/response shape used by all backend
4//! families. Concrete backends live in their own `pleiades-*` crates and
5//! implement [`EphemerisBackend`].
6//!
7//! Enable the optional `serde` feature to serialize the shared request,
8//! result, metadata, and error types used by backend implementations.
9//!
10//! The current time-scale, observer, apparentness, and frame policy is
11//! documented in `docs/time-observer-policy.md` so the direct backend contract
12//! and the façade-level request helpers stay in sync. Direct batch callers
13//! should pair that policy with `validate_requests_against_metadata()` so the
14//! same explicit contract is checked before a slice of requests is dispatched.
15//!
16//! # Examples
17//!
18//! ```
19//! use pleiades_backend::{EphemerisBackend, EphemerisRequest, BackendMetadata, BackendId, BackendFamily,
20//!     BackendProvenance, BackendCapabilities, AccuracyClass, TimeRange, EphemerisResult, EphemerisError,
21//!     EphemerisErrorKind, Apparentness, QualityAnnotation, BodyClaim};
22//! use pleiades_types::{CelestialBody, CoordinateFrame, Instant, JulianDay, Latitude,
23//!     Longitude, TimeScale, ZodiacMode};
24//!
25//! struct ToyBackend;
26//!
27//! impl EphemerisBackend for ToyBackend {
28//!     fn metadata(&self) -> BackendMetadata {
29//!         BackendMetadata {
30//!             id: BackendId::new("toy"),
31//!             version: "0.1.0".to_string(),
32//!             family: BackendFamily::Algorithmic,
33//!             provenance: BackendProvenance { summary: "example backend".to_string(), data_sources: vec![] },
34//!             nominal_range: TimeRange::new(None, None),
35//!             supported_time_scales: vec![TimeScale::Tt],
36//!             body_claims: vec![BodyClaim::from(CelestialBody::Sun)],
37//!             supported_frames: vec![CoordinateFrame::Ecliptic],
38//!             capabilities: BackendCapabilities::default(),
39//!             accuracy: AccuracyClass::Approximate,
40//!             deterministic: true,
41//!             offline: true,
42//!         }
43//!     }
44//!
45//!     fn supports_body(&self, body: CelestialBody) -> bool {
46//!         body == CelestialBody::Sun
47//!     }
48//!
49//!     fn position(&self, request: &EphemerisRequest) -> Result<EphemerisResult, EphemerisError> {
50//!         if request.body != CelestialBody::Sun {
51//!             return Err(EphemerisError::new(EphemerisErrorKind::UnsupportedBody, "only the Sun is supported"));
52//!         }
53//!
54//!         Ok(EphemerisResult::new(
55//!             BackendId::new("toy"),
56//!             request.body.clone(),
57//!             request.instant,
58//!             request.frame,
59//!             request.zodiac_mode.clone(),
60//!             request.apparent,
61//!         ))
62//!     }
63//! }
64//! ```
65
66#![forbid(unsafe_code)]
67#![deny(missing_docs)]
68
69mod capabilities;
70mod claims;
71mod errors;
72mod identity;
73mod metadata;
74mod policy;
75mod release_posture;
76mod request;
77mod result;
78mod traits;
79mod validation;
80
81#[cfg(test)]
82pub(crate) mod test_support;
83
84#[cfg(any(test, feature = "test-backend"))]
85pub mod test_backend;
86
87pub use pleiades_types::{
88    Angle, Apparentness, Ayanamsa, CelestialBody, CelestialBodyClass, CoordinateFrame,
89    CoordinateValidationError, CustomAyanamsa, CustomBodyId, CustomDefinitionValidationError,
90    CustomHouseSystem, EclipticCoordinates, EquatorialCoordinates, HouseSystem, Instant, JulianDay,
91    Latitude, Longitude, Motion, MotionValidationError, ObserverLocation, TimeRange,
92    TimeRangeValidationError, TimeScale, TimeScaleConversion, TimeScaleConversionError, ZodiacMode,
93};
94
95pub use capabilities::{BackendCapabilities, BackendCapabilitiesValidationError};
96pub use claims::{BodyClaim, BodyClaimTier, ClaimEvidence};
97pub use errors::{EphemerisError, EphemerisErrorKind};
98pub use identity::{AccuracyClass, BackendFamily, BackendFamilyPosture, BackendId};
99pub use metadata::{
100    merge_body_claims, BackendMetadata, BackendMetadataValidationError, BackendProvenance,
101    BackendProvenanceValidationError,
102};
103pub use policy::current::{
104    validate_observer_policy, validate_request_against_metadata, validate_request_policy,
105    validate_requests_against_metadata, validate_zodiac_policy,
106};
107pub use policy::{FrameTreatmentSummary, FrameTreatmentSummaryValidationError};
108pub use release_posture::ReleasePosture;
109pub use request::EphemerisRequest;
110pub use result::{EphemerisResult, EphemerisResultValidationError, QualityAnnotation};
111pub use traits::{CompositeBackend, EphemerisBackend, RoutingBackend};