1use crate::{
3 core::time::{nstd_core_time_duration_new, NSTDDuration},
4 NSTDFloat64, NSTDInt64, NSTDUInt32,
5};
6use cfg_if::cfg_if;
7use nstdapi::nstdapi;
8use std::time::{SystemTime, UNIX_EPOCH};
9
10cfg_if! {
11 if #[cfg(unix)] {
12 use crate::os::unix::time::{
13 nstd_os_unix_time_add, nstd_os_unix_time_get, nstd_os_unix_time_nanoseconds,
14 nstd_os_unix_time_now, nstd_os_unix_time_seconds, nstd_os_unix_time_sub,
15 NSTDUnixOptionalTime, NSTDUnixTime,
16 };
17
18 pub type NSTDTime = NSTDUnixTime;
20 impl From<SystemTime> for NSTDTime {
21 fn from(value: SystemTime) -> Self {
23 match value.duration_since(UNIX_EPOCH) {
24 Ok(dur) => Self::from_duration(
25 #[allow(unused_unsafe)]
26 unsafe { nstd_core_time_duration_new(dur.as_secs_f64()) },
28 ),
29 Err(dur) => Self::from_duration(
30 #[allow(unused_unsafe)]
31 unsafe { nstd_core_time_duration_new(-dur.duration().as_secs_f64()) },
33 ),
34 }
35 }
36 }
37
38 pub type NSTDOptionalTime = NSTDUnixOptionalTime;
40 } else {
41 use crate::core::{
42 optional::{gen_optional, NSTDOptional},
43 time::{
44 nstd_core_time_duration_get, nstd_core_time_duration_nanoseconds,
45 nstd_core_time_duration_seconds,
46 },
47 };
48
49 #[nstdapi]
51 #[derive(Clone, Copy, PartialEq)]
52 pub struct NSTDTime {
53 duration: NSTDDuration,
55 }
56 impl From<SystemTime> for NSTDTime {
57 fn from(value: SystemTime) -> Self {
59 match value.duration_since(UNIX_EPOCH) {
60 #[allow(unused_unsafe)]
61 Ok(dur) => Self {
62 duration: unsafe {
64 nstd_core_time_duration_new(dur.as_secs_f64())
65 },
66 },
67 #[allow(unused_unsafe)]
68 Err(dur) => Self {
69 duration: unsafe {
71 nstd_core_time_duration_new(-dur.duration().as_secs_f64())
72 },
73 },
74 }
75 }
76 }
77 gen_optional!(NSTDOptionalTime, NSTDTime);
78 }
79}
80
81#[inline]
88#[nstdapi]
89pub fn nstd_time_now() -> NSTDOptionalTime {
90 #[cfg(unix)]
91 return nstd_os_unix_time_now();
92 #[cfg(not(unix))]
93 return NSTDOptional::Some(NSTDTime::from(SystemTime::now()));
94}
95
96#[inline]
107#[nstdapi]
108pub const fn nstd_time_get(time: NSTDTime) -> NSTDFloat64 {
109 #[cfg(unix)]
110 return nstd_os_unix_time_get(time);
111 #[cfg(not(unix))]
112 return nstd_core_time_duration_get(time.duration);
113}
114
115#[inline]
125#[nstdapi]
126pub const fn nstd_time_seconds(time: NSTDTime) -> NSTDInt64 {
127 #[cfg(unix)]
128 return nstd_os_unix_time_seconds(time);
129 #[cfg(not(unix))]
130 return nstd_core_time_duration_seconds(time.duration);
131}
132
133#[inline]
143#[nstdapi]
144pub fn nstd_time_nanoseconds(time: NSTDTime) -> NSTDUInt32 {
145 #[cfg(unix)]
146 return nstd_os_unix_time_nanoseconds(time);
147 #[cfg(not(unix))]
148 return nstd_core_time_duration_nanoseconds(time.duration);
149}
150
151#[inline]
163#[nstdapi]
164pub fn nstd_time_add(time: NSTDTime, duration: NSTDDuration) -> NSTDTime {
165 #[cfg(unix)]
166 return nstd_os_unix_time_add(time, duration);
167 #[cfg(not(unix))]
168 {
169 let s = nstd_core_time_duration_get(time.duration) + nstd_core_time_duration_get(duration);
170 NSTDTime {
171 duration: nstd_core_time_duration_new(s),
172 }
173 }
174}
175
176#[inline]
188#[nstdapi]
189pub fn nstd_time_sub(time: NSTDTime, duration: NSTDDuration) -> NSTDTime {
190 #[cfg(unix)]
191 return nstd_os_unix_time_sub(time, duration);
192 #[cfg(not(unix))]
193 {
194 let s = nstd_core_time_duration_get(time.duration) - nstd_core_time_duration_get(duration);
195 NSTDTime {
196 duration: nstd_core_time_duration_new(s),
197 }
198 }
199}