use std::error::Error;
use std::fmt::{self, Display, Formatter};
use lox_bodies::{NaifId, Origin};
use lox_core::coords::Cartesian;
use lox_core::glam::DVec3;
use lox_earth::ephemeris::apparent_sun_position;
use lox_ephem::Ephemeris;
use lox_time::{Time, time_scales::Tdb};
#[derive(Debug)]
pub struct AnalyticalSunEphemerisError {
origin_id: NaifId,
target_id: NaifId,
}
impl Display for AnalyticalSunEphemerisError {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(
f,
"analytical ephemeris only supports Earth<->Sun queries (got {}->{})",
self.origin_id, self.target_id
)
}
}
impl Error for AnalyticalSunEphemerisError {}
pub struct AnalyticalSunEphemeris;
impl Ephemeris for AnalyticalSunEphemeris {
type Error = AnalyticalSunEphemerisError;
fn state<O1: Origin, O2: Origin>(
&self,
time: Time<Tdb>,
origin: O1,
target: O2,
) -> Result<Cartesian, Self::Error> {
let origin_id = origin.id();
let target_id = target.id();
if origin_id == NaifId(399) && target_id == NaifId(10) {
let pos = apparent_sun_position(time);
Ok(Cartesian::from_vecs(pos, DVec3::ZERO))
} else if origin_id == NaifId(10) && target_id == NaifId(399) {
let pos = apparent_sun_position(time);
Ok(Cartesian::from_vecs(-pos, DVec3::ZERO))
} else {
Err(AnalyticalSunEphemerisError {
origin_id,
target_id,
})
}
}
}