livesplit-core 0.13.0

livesplit-core is a library that provides a lot of functionality for creating a speedrun timer.
Documentation
use core::{mem::MaybeUninit, ops::Sub};

pub use time::{Duration, OffsetDateTime as DateTime};

#[repr(C)]
struct FFIDateTime {
    secs: i64,
    nsecs: u32,
}

extern "C" {
    fn Date_now(data: *mut FFIDateTime);
}

pub fn utc_now() -> DateTime {
    unsafe {
        let mut date_time = MaybeUninit::uninit();
        Date_now(date_time.as_mut_ptr());
        let date_time = date_time.assume_init();
        DateTime::from_unix_timestamp(date_time.secs).unwrap()
            + Duration::nanoseconds(date_time.nsecs as _)
    }
}

extern "C" {
    fn Instant_now() -> f64;
}

#[derive(Copy, Clone, PartialOrd, PartialEq, Ord, Eq, Debug)]
pub struct Instant(Duration);

impl Instant {
    pub fn now() -> Self {
        let secs = unsafe { Instant_now() };
        let nanos = (secs.fract() * 1_000_000_000.0) as _;
        let secs = secs as _;
        Instant(Duration::new(secs, nanos))
    }
}

impl Sub<Duration> for Instant {
    type Output = Instant;

    fn sub(self, rhs: Duration) -> Instant {
        Self(self.0 - rhs)
    }
}

impl Sub for Instant {
    type Output = Duration;

    fn sub(self, rhs: Instant) -> Duration {
        self.0 - rhs.0
    }
}

pub fn to_local(date_time: DateTime) -> DateTime {
    date_time
}