toasty_core/schema/app/constraint/
length.rs

1use super::Constraint;
2
3use crate::{stmt, Result};
4
5#[derive(Debug, Clone)]
6pub struct ConstraintLength {
7    /// The minimum length of the field.
8    pub min: Option<u64>,
9
10    /// The maximum length of the field.
11    pub max: Option<u64>,
12}
13impl ConstraintLength {
14    pub(crate) fn check(&self, expr: &crate::stmt::Entry<'_>) -> Result<()> {
15        let Some(stmt::Value::String(value)) = expr.try_as_value() else {
16            return Ok(());
17        };
18
19        let value_len = value.len();
20        let min = self.min.map(|m| m as usize);
21        let max = self.max.map(|m| m as usize);
22
23        // Check minimum length
24        if let Some(min_val) = min {
25            if value_len < min_val {
26                return Err(crate::Error::validation_length(value_len, min, max));
27            }
28        }
29
30        // Check maximum length
31        if let Some(max_val) = max {
32            if value_len > max_val {
33                return Err(crate::Error::validation_length(value_len, min, max));
34            }
35        }
36
37        Ok(())
38    }
39}
40
41impl From<ConstraintLength> for Constraint {
42    fn from(length: ConstraintLength) -> Self {
43        Constraint::Length(length)
44    }
45}