use crate::core::constraint::Constraint;
use anyhow::{anyhow, Result};
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Maximum {
#[serde(rename = "maximum")]
pub max_val: f64,
}
impl Constraint for Maximum {
fn validate(&self, val: &Value) -> Result<()> {
match val {
Value::Number(v) if v.is_f64() && (v.as_f64().unwrap() > self.max_val) => {
Err(anyhow!(format!(
"value {} is larger then {} ({})",
v, self.max_val, "Maximum"
)))
}
_ => Ok(()),
}
}
}
#[cfg(test)]
mod tests {
use crate::core::constraint::float::maximum::Maximum;
use crate::core::constraint::Constraint;
use serde_json::{Number, Value};
#[test]
fn test_maximum() {
let constraint = Maximum { max_val: 10.0 };
let value = Value::Number(Number::from_f64(3.0).unwrap());
assert!(constraint.validate(&value).is_ok());
let value = Value::Number(Number::from_f64(10.0).unwrap());
assert!(constraint.validate(&value).is_ok());
let value = Value::Number(Number::from_f64(11.0).unwrap());
assert!(constraint.validate(&value).is_err());
}
}