date-rs 1.6.0

Gregorian calendar date
Documentation
//! Serialization to/from PostgreSQL

use diesel::deserialize::FromSql;
use diesel::deserialize::Result as DeserializeResult;
use diesel::pg::Pg;
use diesel::pg::PgValue;
use diesel::pg::data_types::PgDate;
use diesel::serialize::Output;
use diesel::serialize::Result as SerializeResult;
use diesel::serialize::ToSql;
use diesel::sql_types;

use crate::Date;
use crate::interval::DateInterval;

impl ToSql<sql_types::Date, Pg> for Date {
  fn to_sql<'se>(&'se self, out: &mut Output<'se, '_, Pg>) -> SerializeResult {
    let days_since_epoch = (*self - PG_EPOCH).days();
    ToSql::<sql_types::Date, Pg>::to_sql(&PgDate(days_since_epoch), &mut out.reborrow())
  }
}

impl FromSql<sql_types::Date, Pg> for Date {
  fn from_sql(bytes: PgValue<'_>) -> DeserializeResult<Self> {
    let PgDate(offset) = FromSql::<diesel::sql_types::Date, Pg>::from_sql(bytes)?;
    let duration = DateInterval::new(offset);
    Ok(PG_EPOCH + duration)
  }
}

const PG_EPOCH: Date = date! { 2000-01-01 };