novel-api 0.20.0

Novel APIs from various sources
Documentation
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),
    }
}