use std::error::Error;
use qtty::unit::Second;
use qtty::Quantity;
use tempoch::{EncodedTime, J2000s, Time, TDB};
pub trait EphemerisProvider {
type State;
type Error: Error + Send + Sync + 'static;
fn state(&self, body_naif_id: i32, epoch_seconds_tdb: f64) -> Result<Self::State, Self::Error>;
fn state_at(&self, body_naif_id: i32, epoch: Time<TDB>) -> Result<Self::State, Self::Error> {
let encoded: EncodedTime<TDB, J2000s> = epoch.to::<J2000s>();
let secs: Quantity<Second> = encoded.raw();
self.state(body_naif_id, secs.value())
}
}
#[cfg(test)]
mod tests {
use super::*;
use tempoch::{Time, TDB};
struct DummyState;
struct DummyProvider;
impl EphemerisProvider for DummyProvider {
type State = DummyState;
type Error = std::io::Error;
fn state(&self, _id: i32, _t: f64) -> Result<DummyState, Self::Error> {
Ok(DummyState)
}
}
#[test]
fn state_at_forwards_j2000_seconds_to_state() {
let provider = DummyProvider;
let epoch = Time::<TDB>::from_raw_j2000_seconds(qtty::Second::new(123.0)).unwrap();
assert!(provider.state_at(399, epoch).is_ok());
}
}