Skip to main content

lox_frames/
providers.rs

1// SPDX-FileCopyrightText: 2025 Helge Eichhorn <git@helgeeichhorn.de>
2//
3// SPDX-License-Identifier: MPL-2.0
4
5use 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}