dti 0.1.2

A library to handle digital token identifiers as defined in ISO 24165
Documentation
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}"
            ))),
        }
    }
}