#[allow(clippy::approx_constant)]
#[rustfmt::skip]
mod iers_eop_data {
include!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/generated/iers_eop_data.rs"));
}
pub use iers_eop_data::{EopEntry, EOP_TABLE};
pub fn lookup(table: &[EopEntry], mjd: f64) -> Option<EopEntry> {
if table.is_empty() {
return None;
}
let first = table.first().unwrap().mjd;
let last = table.last().unwrap().mjd;
if mjd < first || mjd > last {
return None;
}
let idx = table.partition_point(|e| e.mjd < mjd);
if idx == 0 {
return Some(table[0]);
}
if idx >= table.len() {
return Some(*table.last().unwrap());
}
let lo = &table[idx - 1];
let hi = &table[idx];
if (hi.mjd - mjd).abs() < 1e-10 {
return Some(*hi);
}
if (lo.mjd - mjd).abs() < 1e-10 {
return Some(*lo);
}
let dt = hi.mjd - lo.mjd;
let t = (mjd - lo.mjd) / dt;
Some(EopEntry {
mjd,
xp: lo.xp + t * (hi.xp - lo.xp),
yp: lo.yp + t * (hi.yp - lo.yp),
dut1: lo.dut1 + t * (hi.dut1 - lo.dut1),
dx: lo.dx + t * (hi.dx - lo.dx),
dy: lo.dy + t * (hi.dy - lo.dy),
})
}