This repository has been archived on 2026-05-27. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
rustypipe/src/serializer/date.rs
2022-10-18 22:53:09 +02:00

50 lines
1.4 KiB
Rust

use serde::{
de::{self, Visitor},
ser, Serialize,
};
use serde_with::{DeserializeAs, SerializeAs};
use time::{macros::format_description, Date};
const YMD_FORMAT: &[time::format_description::FormatItem] =
format_description!("[year]-[month]-[day]");
pub struct DateYmd;
impl SerializeAs<Date> for DateYmd {
fn serialize_as<S>(date: &Date, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
date.format(YMD_FORMAT)
.map_err(ser::Error::custom)?
.serialize(serializer)
}
}
impl<'de> DeserializeAs<'de, Date> for DateYmd {
fn deserialize_as<D>(deserializer: D) -> Result<Date, D::Error>
where
D: serde::Deserializer<'de>,
{
struct DateYmdVisitor;
impl<'de> Visitor<'de> for DateYmdVisitor {
type Value = Date;
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
formatter.write_str("a YYYY-MM-DD formatted date")
}
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
Date::parse(v, YMD_FORMAT).map_err(|_| {
de::Error::invalid_value(de::Unexpected::Str(v), &"a YYYY-MM-DD formatted date")
})
}
}
deserializer.deserialize_str(DateYmdVisitor)
}
}