#[derive(Debug,serde::Deserialize)]
#[serde(rename_all="kebab-case")]
pub enum Cmp<T> {
Ge(T),
Gt(T),
Le(T),
Lt(T),
}
impl<T: PartialOrd> Cmp<T> {
pub fn matches(&self, that: &T) -> bool {
match self {
Cmp::Ge(v) => that >= v,
Cmp::Gt(v) => that > v,
Cmp::Le(v) => that <= v,
Cmp::Lt(v) => that < v,
}
}
}
impl<
'd,
T,
S: Into<T> + serde::Deserialize<'d>,
> serde_with::DeserializeAs<'d, Cmp<T>> for Cmp<S> {
fn deserialize_as<D: serde::Deserializer<'d>>(d: D) -> Result<Cmp<T>, D::Error> {
let v = <Cmp::<S> as serde::Deserialize>::deserialize(d)?;
Ok(match v {
Cmp::Ge(v) => Cmp::Ge(v.into()),
Cmp::Gt(v) => Cmp::Gt(v.into()),
Cmp::Le(v) => Cmp::Le(v.into()),
Cmp::Lt(v) => Cmp::Lt(v.into()),
})
}
}