use super::Constraint;
use crate::{Result, stmt};
#[derive(Debug, Clone)]
pub struct ConstraintLength {
pub min: Option<u64>,
pub max: Option<u64>,
}
impl ConstraintLength {
pub(crate) fn check(&self, expr: &crate::stmt::Entry<'_>) -> Result<()> {
let Some(stmt::Value::String(value)) = expr.as_value() else {
return Ok(());
};
let value_len = value.len();
let min = self.min.map(|m| m as usize);
let max = self.max.map(|m| m as usize);
if let Some(min_val) = min
&& value_len < min_val
{
return Err(crate::Error::validation_length(value_len, min, max));
}
if let Some(max_val) = max
&& value_len > max_val
{
return Err(crate::Error::validation_length(value_len, min, max));
}
Ok(())
}
}
impl From<ConstraintLength> for Constraint {
fn from(length: ConstraintLength) -> Self {
Constraint::Length(length)
}
}