use chrono::prelude::*;
#[cfg(feature = "sync")]
use crate::{Middleware, Payload, IntoPayload, FromPayload};
#[cfg(feature = "async")]
use crate::{AsyncMiddleware, AsyncPayload, AsyncIntoPayload, AsyncFromPayload};
use crate::{Error, PayloadInfo};
impl PayloadInfo for DateTime<Utc> {
const TYPE: &'static str = "DateTime<Utc>";
const SIZE: Option<usize> = Some(core::mem::size_of::<DateTime<Utc>>());
}
#[cfg(feature = "sync")]
impl<C> IntoPayload<C> for DateTime<Utc> {
#[inline]
fn into_payload<'m, M: Middleware<'m>>(&self, ctx: &mut C, next: &mut M) -> Result<(), Error> {
next.into_payload(&self.to_rfc3339(), ctx)
}
}
#[cfg(feature = "sync")]
impl<'a, C> FromPayload<'a, C> for DateTime<Utc> {
#[inline]
fn from_payload<M: Middleware<'a>>(ctx: &mut C, next: &mut M) -> Result<Self, Error> {
DateTime::parse_from_rfc3339(next.from_payload(ctx)?)
.map_err(|e| Error::Time(e.to_string()))
.map(|dt| dt.with_timezone(&Utc))
}
}
#[cfg(feature = "sync")]
impl<'a, C> Payload<'a, C> for DateTime<Utc> {}
#[cfg(feature = "async")]
impl<C: Send + Sync> AsyncIntoPayload<C> for DateTime<Utc> {
#[inline]
async fn poll_into_payload<'m, M: AsyncMiddleware<'m>>(&self, ctx: &mut C, next: &mut M) -> Result<(), Error> {
next.poll_into_payload(&self.to_rfc3339(), ctx).await
}
}
#[cfg(feature = "async")]
impl<'a, C: Send + Sync> AsyncFromPayload<'a, C> for DateTime<Utc> {
#[inline]
async fn poll_from_payload<M: AsyncMiddleware<'a>>(ctx: &mut C, next: &mut M) -> Result<Self, Error> {
DateTime::parse_from_rfc3339(next.poll_from_payload(ctx).await?)
.map_err(|e| Error::Time(e.to_string()))
.map(|dt| dt.with_timezone(&Utc))
}
}
#[cfg(feature = "async")]
impl<'a, C: Send + Sync> AsyncPayload<'a, C> for DateTime<Utc> {}
impl PayloadInfo for DateTime<Local> {
const TYPE: &'static str = "DateTime<Local>";
const SIZE: Option<usize> = Some(core::mem::size_of::<DateTime<Local>>());
}
#[cfg(feature = "sync")]
impl<C> IntoPayload<C> for DateTime<Local> {
#[inline]
fn into_payload<'m, M: Middleware<'m>>(&self, ctx: &mut C, next: &mut M) -> Result<(), Error> {
next.into_payload(&self.to_rfc3339(), ctx)
}
}
#[cfg(feature = "sync")]
impl<'a, C> FromPayload<'a, C> for DateTime<Local> {
#[inline]
fn from_payload<M: Middleware<'a>>(ctx: &mut C, next: &mut M) -> Result<Self, Error> {
DateTime::parse_from_rfc3339(next.from_payload(ctx)?)
.map_err(|e| Error::Time(e.to_string()))
.map(|dt| dt.with_timezone(&Local))
}
}
#[cfg(feature = "sync")]
impl<'a, C> Payload<'a, C> for DateTime<Local> {}
#[cfg(feature = "async")]
impl<C: Send + Sync> AsyncIntoPayload<C> for DateTime<Local> {
#[inline]
async fn poll_into_payload<'m, M: AsyncMiddleware<'m>>(&self, ctx: &mut C, next: &mut M) -> Result<(), Error> {
next.poll_into_payload(&self.to_rfc3339(), ctx).await
}
}
#[cfg(feature = "async")]
impl<'a, C: Send + Sync> AsyncFromPayload<'a, C> for DateTime<Local> {
#[inline]
async fn poll_from_payload<M: AsyncMiddleware<'a>>(ctx: &mut C, next: &mut M) -> Result<Self, Error> {
DateTime::parse_from_rfc3339(next.poll_from_payload(ctx).await?)
.map_err(|e| Error::Time(e.to_string()))
.map(|dt| dt.with_timezone(&Local))
}
}
#[cfg(feature = "async")]
impl<'a, C: Send + Sync> AsyncPayload<'a, C> for DateTime<Local> {}
impl PayloadInfo for DateTime<FixedOffset> {
const TYPE: &'static str = "DateTime<FixedOffset>";
const SIZE: Option<usize> = Some(core::mem::size_of::<DateTime<FixedOffset>>());
}
#[cfg(feature = "sync")]
impl<C> IntoPayload<C> for DateTime<FixedOffset> {
#[inline]
fn into_payload<'m, M: Middleware<'m>>(&self, ctx: &mut C, next: &mut M) -> Result<(), Error> {
next.into_payload(&self.to_rfc3339(), ctx)
}
}
#[cfg(feature = "sync")]
impl<'a, C> FromPayload<'a, C> for DateTime<FixedOffset> {
#[inline]
fn from_payload<M: Middleware<'a>>(ctx: &mut C, next: &mut M) -> Result<Self, Error> {
DateTime::parse_from_rfc3339(next.from_payload(ctx)?)
.map_err(|e| Error::Time(e.to_string()))
.map(|dt| dt.with_timezone(dt.offset()))
}
}
#[cfg(feature = "sync")]
impl<'a, C> Payload<'a, C> for DateTime<FixedOffset> {}
#[cfg(feature = "async")]
impl<C: Send + Sync> AsyncIntoPayload<C> for DateTime<FixedOffset> {
#[inline]
async fn poll_into_payload<'m, M: AsyncMiddleware<'m>>(&self, ctx: &mut C, next: &mut M) -> Result<(), Error> {
next.poll_into_payload(&self.to_rfc3339(), ctx).await
}
}
#[cfg(feature = "async")]
impl<'a, C: Send + Sync> AsyncFromPayload<'a, C> for DateTime<FixedOffset> {
#[inline]
async fn poll_from_payload<M: AsyncMiddleware<'a>>(ctx: &mut C, next: &mut M) -> Result<Self, Error> {
DateTime::parse_from_rfc3339(next.poll_from_payload(ctx).await?)
.map_err(|e| Error::Time(e.to_string()))
.map(|dt| dt.with_timezone(dt.offset()))
}
}
#[cfg(feature = "async")]
impl<'a, C: Send + Sync> AsyncPayload<'a, C> for DateTime<FixedOffset> {}