pub mod bodies;
pub mod eval;
#[cfg(feature = "de440")]
pub mod de440;
use eval::SegmentDescriptor;
use crate::calculus::ephemeris::{AuPerDay, Ephemeris};
use crate::coordinates::{
cartesian::{Position, Velocity},
centers::{Barycentric, Geocentric, Heliocentric},
frames::EclipticMeanJ2000,
};
use crate::time::JulianDate;
use qtty::{AstronomicalUnit, Kilometer};
use core::marker::PhantomData;
pub trait DeData: 'static {
const SUN: SegmentDescriptor;
const EMB: SegmentDescriptor;
const MOON: SegmentDescriptor;
}
#[derive(Debug, Clone, Copy, Default)]
pub struct DeEphemeris<D: DeData>(PhantomData<D>);
impl<D: DeData> Ephemeris for DeEphemeris<D> {
#[inline]
fn sun_barycentric(
jd: JulianDate,
) -> Position<Barycentric, EclipticMeanJ2000, AstronomicalUnit> {
bodies::sun_barycentric(jd, &D::SUN)
}
#[inline]
fn earth_barycentric(
jd: JulianDate,
) -> Position<Barycentric, EclipticMeanJ2000, AstronomicalUnit> {
bodies::earth_barycentric(jd, &D::EMB, &D::MOON)
}
#[inline]
fn earth_heliocentric(
jd: JulianDate,
) -> Position<Heliocentric, EclipticMeanJ2000, AstronomicalUnit> {
bodies::earth_heliocentric(jd, &D::SUN, &D::EMB, &D::MOON)
}
#[inline]
fn earth_barycentric_velocity(jd: JulianDate) -> Velocity<EclipticMeanJ2000, AuPerDay> {
bodies::earth_barycentric_velocity(jd, &D::EMB, &D::MOON)
}
#[inline]
fn moon_geocentric(jd: JulianDate) -> Position<Geocentric, EclipticMeanJ2000, Kilometer> {
bodies::moon_geocentric(jd, &D::MOON)
}
}