pray-core 1.16.0

Core library for Prayfile, the package manager for the language placed before inference
Documentation
use serde::Deserialize;

pub const MAX_PUBLISH_TIMESTAMP: u64 = 253_402_300_799;

pub fn deserialize_optional_publish_timestamp<'de, D>(
    deserializer: D,
) -> Result<Option<u64>, D::Error>
where
    D: serde::Deserializer<'de>,
{
    let value = serde_json::Value::deserialize(deserializer)?;
    let timestamp = match value {
        serde_json::Value::Number(number) => number.as_u64(),
        serde_json::Value::String(legacy) => legacy.parse::<u64>().ok(),
        _ => None,
    }
    .filter(|timestamp| *timestamp <= MAX_PUBLISH_TIMESTAMP)
    .ok_or_else(|| serde::de::Error::custom("published_at must be whole UTC Unix seconds"))?;
    Ok(Some(timestamp))
}