use crate::earth::context::TimeContext;
use crate::format::TimeFormat;
use crate::foundation::error::ConversionError;
use crate::model::scale::{TT, UTC};
use crate::model::target::InfallibleConversionTarget;
use crate::model::time::Time;
use crate::InfallibleFormatForScale;
use chrono::{DateTime, Utc};
impl<F: TimeFormat> Time<TT, F>
where
F: InfallibleFormatForScale<TT> + InfallibleConversionTarget<TT, Output = Time<TT, F>>,
{
#[inline]
pub fn try_from_chrono(dt: DateTime<Utc>) -> Result<Self, ConversionError> {
Ok(Time::<UTC>::try_from_chrono(dt)?.to::<TT>().reinterpret())
}
#[track_caller]
#[inline]
pub fn from_chrono(dt: DateTime<Utc>) -> Self {
Self::try_from_chrono(dt).expect("UTC conversion failed; use try_from_chrono")
}
#[inline]
pub fn try_from_chrono_with(
dt: DateTime<Utc>,
ctx: &TimeContext,
) -> Result<Self, ConversionError> {
Ok(Time::<UTC>::try_from_chrono_with(dt, ctx)?
.to::<TT>()
.reinterpret())
}
#[track_caller]
#[inline]
pub fn from_chrono_with(dt: DateTime<Utc>, ctx: &TimeContext) -> Self {
Self::try_from_chrono_with(dt, ctx)
.expect("UTC conversion failed; use try_from_chrono_with")
}
#[inline]
pub fn try_to_chrono(self) -> Result<DateTime<Utc>, ConversionError> {
self.to_j2000s().to::<UTC>().try_to_chrono()
}
#[inline]
pub fn to_chrono(self) -> Option<DateTime<Utc>> {
self.try_to_chrono().ok()
}
#[inline]
pub fn try_to_chrono_with(self, ctx: &TimeContext) -> Result<DateTime<Utc>, ConversionError> {
self.to_j2000s().to::<UTC>().try_to_chrono_with(ctx)
}
#[inline]
pub fn to_chrono_with(self, ctx: &TimeContext) -> Option<DateTime<Utc>> {
self.try_to_chrono_with(ctx).ok()
}
}
impl<F: TimeFormat> From<DateTime<Utc>> for Time<TT, F>
where
F: InfallibleFormatForScale<TT> + InfallibleConversionTarget<TT, Output = Time<TT, F>>,
{
#[inline]
fn from(value: DateTime<Utc>) -> Self {
Self::from_chrono(value)
}
}