use crate::{
core::time::{nstd_core_time_duration_new, NSTDDuration},
NSTDFloat64, NSTDInt64, NSTDUInt32,
};
use cfg_if::cfg_if;
use nstdapi::nstdapi;
use std::time::{SystemTime, UNIX_EPOCH};
cfg_if! {
if #[cfg(unix)] {
use crate::os::unix::time::{
nstd_os_unix_time_add, nstd_os_unix_time_get, nstd_os_unix_time_nanoseconds,
nstd_os_unix_time_now, nstd_os_unix_time_seconds, nstd_os_unix_time_sub,
NSTDUnixOptionalTime, NSTDUnixTime,
};
pub type NSTDTime = NSTDUnixTime;
impl From<SystemTime> for NSTDTime {
fn from(value: SystemTime) -> Self {
match value.duration_since(UNIX_EPOCH) {
Ok(dur) => Self::from_duration(
#[allow(unused_unsafe)]
unsafe { nstd_core_time_duration_new(dur.as_secs_f64()) },
),
Err(dur) => Self::from_duration(
#[allow(unused_unsafe)]
unsafe { nstd_core_time_duration_new(-dur.duration().as_secs_f64()) },
),
}
}
}
pub type NSTDOptionalTime = NSTDUnixOptionalTime;
} else {
use crate::core::{
optional::{gen_optional, NSTDOptional},
time::{
nstd_core_time_duration_get, nstd_core_time_duration_nanoseconds,
nstd_core_time_duration_seconds,
},
};
#[nstdapi]
#[derive(Clone, Copy, PartialEq)]
pub struct NSTDTime {
duration: NSTDDuration,
}
impl From<SystemTime> for NSTDTime {
fn from(value: SystemTime) -> Self {
match value.duration_since(UNIX_EPOCH) {
#[allow(unused_unsafe)]
Ok(dur) => Self {
duration: unsafe {
nstd_core_time_duration_new(dur.as_secs_f64())
},
},
#[allow(unused_unsafe)]
Err(dur) => Self {
duration: unsafe {
nstd_core_time_duration_new(-dur.duration().as_secs_f64())
},
},
}
}
}
gen_optional!(NSTDOptionalTime, NSTDTime);
}
}
#[inline]
#[nstdapi]
pub fn nstd_time_now() -> NSTDOptionalTime {
#[cfg(unix)]
return nstd_os_unix_time_now();
#[cfg(not(unix))]
return NSTDOptional::Some(NSTDTime::from(SystemTime::now()));
}
#[inline]
#[nstdapi]
pub const fn nstd_time_get(time: NSTDTime) -> NSTDFloat64 {
#[cfg(unix)]
return nstd_os_unix_time_get(time);
#[cfg(not(unix))]
return nstd_core_time_duration_get(time.duration);
}
#[inline]
#[nstdapi]
pub const fn nstd_time_seconds(time: NSTDTime) -> NSTDInt64 {
#[cfg(unix)]
return nstd_os_unix_time_seconds(time);
#[cfg(not(unix))]
return nstd_core_time_duration_seconds(time.duration);
}
#[inline]
#[nstdapi]
pub fn nstd_time_nanoseconds(time: NSTDTime) -> NSTDUInt32 {
#[cfg(unix)]
return nstd_os_unix_time_nanoseconds(time);
#[cfg(not(unix))]
return nstd_core_time_duration_nanoseconds(time.duration);
}
#[inline]
#[nstdapi]
pub fn nstd_time_add(time: NSTDTime, duration: NSTDDuration) -> NSTDTime {
#[cfg(unix)]
return nstd_os_unix_time_add(time, duration);
#[cfg(not(unix))]
{
let s = nstd_core_time_duration_get(time.duration) + nstd_core_time_duration_get(duration);
NSTDTime {
duration: nstd_core_time_duration_new(s),
}
}
}
#[inline]
#[nstdapi]
pub fn nstd_time_sub(time: NSTDTime, duration: NSTDDuration) -> NSTDTime {
#[cfg(unix)]
return nstd_os_unix_time_sub(time, duration);
#[cfg(not(unix))]
{
let s = nstd_core_time_duration_get(time.duration) - nstd_core_time_duration_get(duration);
NSTDTime {
duration: nstd_core_time_duration_new(s),
}
}
}