pub mod utc {
use chrono::{DateTime, TimeZone, Utc};
use serde::{self, Deserialize, Deserializer};
const FORMAT: &str = "%Y-%m-%dT%H:%M:%S";
pub fn deserialize<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
Utc.datetime_from_str(&s, FORMAT)
.map_err(serde::de::Error::custom)
}
}
pub mod version {
use std::str::FromStr;
const VERSION: &str = "1.*";
use serde::{self, Deserialize, Deserializer};
pub fn deserialize<'de, D>(deserializer: D) -> Result<semver::Version, D::Error>
where
D: Deserializer<'de>,
{
let mut s = String::deserialize(deserializer)?;
if !s.is_empty() {
s.remove(0);
}
let r = semver::Version::parse(&s).map_err(serde::de::Error::custom)?;
let v = semver::VersionReq::from_str(&format!("={VERSION}"));
match v {
Ok(val) => {
if val.matches(&r) {
Ok(r)
} else {
Err(serde::de::Error::custom(format!(
"Version incompatible. templateVersion is V{r}. Expected V{VERSION}"
)))
}
}
Err(err) => Err(serde::de::Error::custom(format!(
"Invalid internal VERSION set: {err}"
))),
}
}
}