use crate::fmt::format::Writer;
use std::fmt;
use std::time::Instant;
mod datetime;
#[cfg(feature = "time")]
mod time_crate;
#[cfg(feature = "time")]
#[cfg_attr(docsrs, doc(cfg(feature = "time")))]
pub use time_crate::UtcTime;
#[cfg(feature = "local-time")]
#[cfg_attr(docsrs, doc(cfg(all(unsound_local_offset, feature = "local-time"))))]
pub use time_crate::LocalTime;
#[cfg(feature = "time")]
#[cfg_attr(docsrs, doc(cfg(feature = "time")))]
pub use time_crate::OffsetTime;
#[cfg(feature = "chrono")]
mod chrono_crate;
#[cfg(feature = "chrono")]
#[cfg_attr(docsrs, doc(cfg(feature = "chrono")))]
pub use chrono_crate::ChronoLocal;
#[cfg(feature = "chrono")]
#[cfg_attr(docsrs, doc(cfg(feature = "chrono")))]
pub use chrono_crate::ChronoUtc;
pub trait FormatTime {
fn format_time(&self, w: &mut Writer<'_>) -> fmt::Result;
}
pub fn time() -> SystemTime {
SystemTime
}
pub fn uptime() -> Uptime {
Uptime::default()
}
impl<F> FormatTime for &F
where
F: FormatTime,
{
fn format_time(&self, w: &mut Writer<'_>) -> fmt::Result {
(*self).format_time(w)
}
}
impl FormatTime for () {
fn format_time(&self, _: &mut Writer<'_>) -> fmt::Result {
Ok(())
}
}
impl FormatTime for fn(&mut Writer<'_>) -> fmt::Result {
fn format_time(&self, w: &mut Writer<'_>) -> fmt::Result {
(*self)(w)
}
}
#[derive(Debug, Clone, Copy, Eq, PartialEq, Default)]
pub struct SystemTime;
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub struct Uptime {
epoch: Instant,
}
impl Default for Uptime {
fn default() -> Self {
Uptime {
epoch: Instant::now(),
}
}
}
impl From<Instant> for Uptime {
fn from(epoch: Instant) -> Self {
Uptime { epoch }
}
}
impl FormatTime for SystemTime {
fn format_time(&self, w: &mut Writer<'_>) -> fmt::Result {
write!(
w,
"{}",
datetime::DateTime::from(std::time::SystemTime::now())
)
}
}
impl FormatTime for Uptime {
fn format_time(&self, w: &mut Writer<'_>) -> fmt::Result {
let e = self.epoch.elapsed();
write!(w, "{:4}.{:09}s", e.as_secs(), e.subsec_nanos())
}
}