use crate::{
ago::AgoDisplay, duration::DurationDisplay, DurationConversionError, DurationOptions,
NegativeDurationError,
};
pub trait ChronoHumanize: Sized {
fn try_human_duration(self) -> Result<DurationDisplay, NegativeDurationError>;
fn try_human_duration_with(
self,
options: DurationOptions,
) -> Result<DurationDisplay, NegativeDurationError>;
fn try_human_ago(self) -> Result<AgoDisplay, NegativeDurationError>;
fn try_human_ago_with(
self,
options: DurationOptions,
) -> Result<AgoDisplay, NegativeDurationError>;
}
impl ChronoHumanize for ::chrono::TimeDelta {
#[inline]
fn try_human_duration(self) -> Result<DurationDisplay, NegativeDurationError> {
duration(self)
}
#[inline]
fn try_human_duration_with(
self,
options: DurationOptions,
) -> Result<DurationDisplay, NegativeDurationError> {
duration_with(self, options)
}
#[inline]
fn try_human_ago(self) -> Result<AgoDisplay, NegativeDurationError> {
ago(self)
}
#[inline]
fn try_human_ago_with(
self,
options: DurationOptions,
) -> Result<AgoDisplay, NegativeDurationError> {
ago_with(self, options)
}
}
pub fn duration(value: ::chrono::TimeDelta) -> Result<DurationDisplay, NegativeDurationError> {
duration_with(value, DurationOptions::new())
}
pub fn duration_with(
value: ::chrono::TimeDelta,
options: DurationOptions,
) -> Result<DurationDisplay, NegativeDurationError> {
duration_with_checked(value, options).map_err(|_| NegativeDurationError)
}
pub fn duration_checked(
value: ::chrono::TimeDelta,
) -> Result<DurationDisplay, DurationConversionError> {
duration_with_checked(value, DurationOptions::new())
}
pub fn duration_with_checked(
value: ::chrono::TimeDelta,
options: DurationOptions,
) -> Result<DurationDisplay, DurationConversionError> {
Ok(crate::duration::duration_with(
to_std_checked(value)?,
options,
))
}
pub fn ago(value: ::chrono::TimeDelta) -> Result<AgoDisplay, NegativeDurationError> {
ago_with(value, DurationOptions::new())
}
pub fn ago_with(
value: ::chrono::TimeDelta,
options: DurationOptions,
) -> Result<AgoDisplay, NegativeDurationError> {
ago_with_checked(value, options).map_err(|_| NegativeDurationError)
}
pub fn ago_checked(value: ::chrono::TimeDelta) -> Result<AgoDisplay, DurationConversionError> {
ago_with_checked(value, DurationOptions::new())
}
pub fn ago_with_checked(
value: ::chrono::TimeDelta,
options: DurationOptions,
) -> Result<AgoDisplay, DurationConversionError> {
Ok(crate::ago::ago_with(to_std_checked(value)?, options))
}
pub fn ago_since<Tz1: ::chrono::TimeZone, Tz2: ::chrono::TimeZone>(
then: ::chrono::DateTime<Tz1>,
now: ::chrono::DateTime<Tz2>,
) -> Result<AgoDisplay, NegativeDurationError> {
ago_checked(now.signed_duration_since(then)).map_err(|_| NegativeDurationError)
}
pub fn ago_since_with<Tz1: ::chrono::TimeZone, Tz2: ::chrono::TimeZone>(
then: ::chrono::DateTime<Tz1>,
now: ::chrono::DateTime<Tz2>,
options: DurationOptions,
) -> Result<AgoDisplay, NegativeDurationError> {
ago_since_with_checked(then, now, options).map_err(|_| NegativeDurationError)
}
pub fn ago_since_checked<Tz1: ::chrono::TimeZone, Tz2: ::chrono::TimeZone>(
then: ::chrono::DateTime<Tz1>,
now: ::chrono::DateTime<Tz2>,
) -> Result<AgoDisplay, DurationConversionError> {
ago_checked(now.signed_duration_since(then))
}
pub fn ago_since_with_checked<Tz1: ::chrono::TimeZone, Tz2: ::chrono::TimeZone>(
then: ::chrono::DateTime<Tz1>,
now: ::chrono::DateTime<Tz2>,
options: DurationOptions,
) -> Result<AgoDisplay, DurationConversionError> {
ago_with_checked(now.signed_duration_since(then), options)
}
fn to_std_checked(
value: ::chrono::TimeDelta,
) -> Result<core::time::Duration, DurationConversionError> {
if value < ::chrono::TimeDelta::zero() {
return Err(DurationConversionError::NegativeDuration);
}
value
.to_std()
.map_err(|_| DurationConversionError::OutOfRange)
}