qorzen_oxide/utils/
time.rs

1// src/utils/time.rs - Cross-platform time utilities
2
3use chrono::{DateTime, Duration, Utc};
4
5/// Cross-platform time utilities that work on both native and WASM
6pub struct Time;
7
8impl Time {
9    /// Get current UTC time - works on both native and WASM
10    pub fn now() -> DateTime<Utc> {
11        #[cfg(not(target_arch = "wasm32"))]
12        {
13            Utc::now()
14        }
15
16        #[cfg(target_arch = "wasm32")]
17        {
18            let millis = js_sys::Date::now() as i64;
19            match DateTime::from_timestamp_millis(millis) {
20                Some(dt) => dt,
21                None => {
22                    web_sys::console::error_1(
23                        &"Failed to create DateTime from JS timestamp".into(),
24                    );
25                    // Fallback to a fixed date
26                    DateTime::from_timestamp(1640995200, 0).unwrap()
27                }
28            }
29        }
30    }
31
32    /// Get current timestamp as milliseconds since epoch
33    pub fn now_millis() -> u64 {
34        #[cfg(not(target_arch = "wasm32"))]
35        {
36            Utc::now().timestamp_millis() as u64
37        }
38
39        #[cfg(target_arch = "wasm32")]
40        {
41            js_sys::Date::now() as u64
42        }
43    }
44
45    /// Create a DateTime from milliseconds since epoch
46    pub fn from_millis(millis: i64) -> DateTime<Utc> {
47        DateTime::from_timestamp_millis(millis).unwrap_or_else(|| {
48            DateTime::from_timestamp(1640995200, 0).unwrap() // Fallback
49        })
50    }
51
52    /// Create a duration from milliseconds
53    pub fn duration_millis(millis: i64) -> Duration {
54        Duration::milliseconds(millis)
55    }
56
57    /// Create a duration from seconds
58    pub fn duration_secs(secs: i64) -> Duration {
59        Duration::seconds(secs)
60    }
61
62    /// Create a duration from hours
63    pub fn duration_hours(hours: i64) -> Duration {
64        Duration::hours(hours)
65    }
66
67    /// Create a duration from days
68    pub fn duration_days(days: i64) -> Duration {
69        Duration::days(days)
70    }
71}