use crate::{ custom_anyhow, modules::{FmtDateTime, FmtOffsetTime, FmtRelativeTime}, }; use anyhow::Result; use chrono::{DateTime, Local, Utc}; use serde::Serialize; use serde_json::{Value, json}; use std::time::Duration as StdDuration; use sysinfo::System; #[derive(Debug, Serialize)] struct DateInfo { time_offset: FmtOffsetTime, local_date_time: FmtDateTime, utc_date_time: FmtDateTime, } #[derive(Debug, Serialize)] pub struct UptimeInfo { boot: DateInfo, now: DateInfo, relative: FmtRelativeTime, } #[allow(dead_code)] pub fn get_struct() -> Result { let boot_time_utc = DateTime::::from_timestamp(System::boot_time() as i64, 0).ok_or( custom_anyhow!("Invalid, or out of range timestamp") .context("Invalid timestamp: check seconds < 8_220_000_000_000"), )?; let boot_time_local: DateTime = boot_time_utc.with_timezone(&Local); let relative_time = StdDuration::from_secs((Local::now() - boot_time_local).num_seconds() as u64); Ok(UptimeInfo { boot: DateInfo { time_offset: FmtOffsetTime(Local::now()), local_date_time: FmtDateTime(boot_time_local), utc_date_time: FmtDateTime(boot_time_utc), }, now: DateInfo { time_offset: FmtOffsetTime(Local::now()), local_date_time: FmtDateTime(Local::now()), utc_date_time: FmtDateTime(Utc::now()), }, relative: FmtRelativeTime(relative_time), }) } #[allow(dead_code)] pub fn get_json() -> Result { Ok(json!(get_struct()?)) }