use jiff::Timestamp;
use jiff::civil::DateTime;
use serde::{Deserialize, Deserializer};
pub(crate) fn date_format<'de, D>(deserializer: D) -> Result<Timestamp, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
let format = if s.contains("T") {
"%Y-%m-%dT%H:%M:%S"
} else {
"%Y-%m-%d %H:%M:%S"
};
let timestamp = DateTime::strptime(format, &s)
.and_then(|data_time| data_time.in_tz(crate::TIME_ZONE_NAME))
.map(|zoned| zoned.timestamp())
.map_err(serde::de::Error::custom)?;
Ok(timestamp)
}
pub(crate) fn date_format_option<'de, D>(deserializer: D) -> Result<Option<Timestamp>, D::Error>
where
D: Deserializer<'de>,
{
let s: Option<String> = Option::deserialize(deserializer)?;
let Some(s) = s else {
return Ok(None);
};
let format = if s.contains("T") {
"%Y-%m-%dT%H:%M:%S"
} else {
"%Y-%m-%d %H:%M:%S"
};
match DateTime::strptime(format, &s)
.and_then(|data_time| data_time.in_tz(crate::TIME_ZONE_NAME))
.map(|zoned| zoned.timestamp())
{
Ok(timestamp) => Ok(Some(timestamp)),
Err(_) => Ok(None),
}
}