use crate::i64::consts::SECONDS_BETWEEN_JD_AND_J2000;
use super::deltas::TimeDelta;
pub const J0: TimeDelta = TimeDelta::from_seconds(-SECONDS_BETWEEN_JD_AND_J2000);
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Epoch {
JulianDate,
ModifiedJulianDate,
J1950,
J2000,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Unit {
Seconds,
Days,
Years,
Centuries,
}
pub trait JulianDate {
fn julian_date(&self, epoch: Epoch, unit: Unit) -> f64;
fn two_part_julian_date(&self) -> (f64, f64) {
let jd = self.julian_date(Epoch::JulianDate, Unit::Days);
(jd.trunc(), jd.fract())
}
fn seconds_since_julian_epoch(&self) -> f64 {
self.julian_date(Epoch::JulianDate, Unit::Seconds)
}
fn seconds_since_modified_julian_epoch(&self) -> f64 {
self.julian_date(Epoch::ModifiedJulianDate, Unit::Seconds)
}
fn seconds_since_j1950(&self) -> f64 {
self.julian_date(Epoch::J1950, Unit::Seconds)
}
fn seconds_since_j2000(&self) -> f64 {
self.julian_date(Epoch::J2000, Unit::Seconds)
}
fn days_since_julian_epoch(&self) -> f64 {
self.julian_date(Epoch::JulianDate, Unit::Days)
}
fn days_since_modified_julian_epoch(&self) -> f64 {
self.julian_date(Epoch::ModifiedJulianDate, Unit::Days)
}
fn days_since_j1950(&self) -> f64 {
self.julian_date(Epoch::J1950, Unit::Days)
}
fn days_since_j2000(&self) -> f64 {
self.julian_date(Epoch::J2000, Unit::Days)
}
fn years_since_julian_epoch(&self) -> f64 {
self.julian_date(Epoch::JulianDate, Unit::Years)
}
fn years_since_modified_julian_epoch(&self) -> f64 {
self.julian_date(Epoch::ModifiedJulianDate, Unit::Years)
}
fn years_since_j1950(&self) -> f64 {
self.julian_date(Epoch::J1950, Unit::Years)
}
fn years_since_j2000(&self) -> f64 {
self.julian_date(Epoch::J2000, Unit::Years)
}
fn centuries_since_julian_epoch(&self) -> f64 {
self.julian_date(Epoch::JulianDate, Unit::Centuries)
}
fn centuries_since_modified_julian_epoch(&self) -> f64 {
self.julian_date(Epoch::ModifiedJulianDate, Unit::Centuries)
}
fn centuries_since_j1950(&self) -> f64 {
self.julian_date(Epoch::J1950, Unit::Centuries)
}
fn centuries_since_j2000(&self) -> f64 {
self.julian_date(Epoch::J2000, Unit::Centuries)
}
}