1use std::convert::Infallible;
6
7use lox_time::{
8 Time,
9 deltas::TimeDelta,
10 offsets::OffsetProvider,
11 time_scales::{Tai, TimeScale},
12 utc::{
13 Utc,
14 leap_seconds::{DefaultLeapSecondsProvider, LeapSecondsProvider},
15 },
16};
17
18use crate::{
19 iers::{Corrections, ReferenceSystem, polar_motion::PoleCoords},
20 rotations::RotationProvider,
21};
22
23#[derive(Copy, Clone, Debug)]
24pub struct DefaultRotationProvider;
25
26impl OffsetProvider for DefaultRotationProvider {
27 type Error = Infallible;
28
29 fn tai_to_ut1(&self, delta: TimeDelta) -> Result<TimeDelta, Self::Error> {
30 let Some(_) = delta.seconds() else {
31 return Ok(TimeDelta::ZERO);
32 };
33 let tai = Time::from_delta(Tai, delta);
34 Ok(DefaultLeapSecondsProvider.delta_tai_utc(tai))
35 }
36
37 fn ut1_to_tai(&self, delta: TimeDelta) -> Result<TimeDelta, Self::Error> {
38 let Ok(utc) = Utc::from_delta(delta) else {
39 return Ok(TimeDelta::ZERO);
40 };
41 Ok(DefaultLeapSecondsProvider.delta_utc_tai(utc))
42 }
43}
44
45impl<T> RotationProvider<T> for DefaultRotationProvider
46where
47 T: TimeScale,
48{
49 type EopError = Infallible;
50
51 fn corrections(
52 &self,
53 _time: Time<T>,
54 _sys: ReferenceSystem,
55 ) -> Result<Corrections, Self::EopError> {
56 Ok(Corrections::default())
57 }
58
59 fn pole_coords(&self, _time: Time<T>) -> Result<PoleCoords, Self::EopError> {
60 Ok(PoleCoords::default())
61 }
62}