use crate::{
ago::AgoDisplay, duration::DurationDisplay, locale::Locale, DurationConversionError,
DurationOptions, NegativeDurationError,
};
pub trait TimeHumanize: Sized {
fn try_human_duration(self) -> Result<DurationDisplay, NegativeDurationError>;
fn try_human_duration_with<L: Locale>(
self,
options: DurationOptions<L>,
) -> Result<DurationDisplay<L>, NegativeDurationError>;
fn try_human_ago(self) -> Result<AgoDisplay, NegativeDurationError>;
fn try_human_ago_with<L: Locale>(
self,
options: DurationOptions<L>,
) -> Result<AgoDisplay<L>, NegativeDurationError>;
}
impl TimeHumanize for ::time::Duration {
fn try_human_duration(self) -> Result<DurationDisplay, NegativeDurationError> {
duration(self)
}
fn try_human_duration_with<L: Locale>(
self,
options: DurationOptions<L>,
) -> Result<DurationDisplay<L>, NegativeDurationError> {
duration_with(self, options)
}
fn try_human_ago(self) -> Result<AgoDisplay, NegativeDurationError> {
ago(self)
}
fn try_human_ago_with<L: Locale>(
self,
options: DurationOptions<L>,
) -> Result<AgoDisplay<L>, NegativeDurationError> {
ago_with(self, options)
}
}
pub fn duration(value: ::time::Duration) -> Result<DurationDisplay, NegativeDurationError> {
duration_with(value, DurationOptions::new())
}
pub fn duration_with<L: Locale>(
value: ::time::Duration,
options: DurationOptions<L>,
) -> Result<DurationDisplay<L>, NegativeDurationError> {
duration_with_checked(value, options).map_err(|_| NegativeDurationError)
}
pub fn duration_checked(
value: ::time::Duration,
) -> Result<DurationDisplay, DurationConversionError> {
duration_with_checked(value, DurationOptions::new())
}
pub fn duration_with_checked<L: Locale>(
value: ::time::Duration,
options: DurationOptions<L>,
) -> Result<DurationDisplay<L>, DurationConversionError> {
Ok(crate::duration::duration_with(
to_std_checked(value)?,
options,
))
}
pub fn ago(value: ::time::Duration) -> Result<AgoDisplay, NegativeDurationError> {
ago_with(value, DurationOptions::new())
}
pub fn ago_with<L: Locale>(
value: ::time::Duration,
options: DurationOptions<L>,
) -> Result<AgoDisplay<L>, NegativeDurationError> {
ago_with_checked(value, options).map_err(|_| NegativeDurationError)
}
pub fn ago_checked(value: ::time::Duration) -> Result<AgoDisplay, DurationConversionError> {
ago_with_checked(value, DurationOptions::new())
}
pub fn ago_with_checked<L: Locale>(
value: ::time::Duration,
options: DurationOptions<L>,
) -> Result<AgoDisplay<L>, DurationConversionError> {
Ok(crate::ago::ago_with(to_std_checked(value)?, options))
}
pub fn ago_since(
then: ::time::OffsetDateTime,
now: ::time::OffsetDateTime,
) -> Result<AgoDisplay, NegativeDurationError> {
ago_checked(now - then).map_err(|_| NegativeDurationError)
}
pub fn ago_since_with<L: Locale>(
then: ::time::OffsetDateTime,
now: ::time::OffsetDateTime,
options: DurationOptions<L>,
) -> Result<AgoDisplay<L>, NegativeDurationError> {
ago_since_with_checked(then, now, options).map_err(|_| NegativeDurationError)
}
pub fn ago_since_checked(
then: ::time::OffsetDateTime,
now: ::time::OffsetDateTime,
) -> Result<AgoDisplay, DurationConversionError> {
ago_checked(now - then)
}
pub fn ago_since_with_checked<L: Locale>(
then: ::time::OffsetDateTime,
now: ::time::OffsetDateTime,
options: DurationOptions<L>,
) -> Result<AgoDisplay<L>, DurationConversionError> {
ago_with_checked(now - then, options)
}
fn to_std_checked(
value: ::time::Duration,
) -> Result<core::time::Duration, DurationConversionError> {
if value.is_negative() {
return Err(DurationConversionError::NegativeDuration);
}
Ok(value.unsigned_abs())
}