hit_data/model/validators/
mod.rs

1use crate::{errors::ValidationError, Hit};
2use crate::{errors::ValidationErrorLevel, HitError};
3use std::rc::Rc;
4
5pub type Validators<T> = Vec<Box<dyn Validator<T>>>;
6
7pub trait Validator<T> {
8    fn validate(
9        &self,
10        value: &T,
11        context: &ValidatorContext,
12    ) -> Result<Option<Vec<ValidationError>>, HitError>;
13
14    fn on_kernel_init(&mut self, field_name: &str, model_name: &str) -> Result<(), HitError>;
15}
16
17pub struct MaxLength {
18    pub length: u8,
19}
20pub static ERROR_MAX_LENGTH: &str = "Max length was reached.";
21
22pub struct ValidatorContext<'a> {
23    pub id: &'a str,
24    pub property: &'a str,
25    pub index: Rc<&'a Hit>,
26}
27
28static MAX_LENGTH: &str = "MAX_LENGTH";
29
30impl Validator<String> for MaxLength {
31    fn validate(
32        &self,
33        value: &String,
34        _context: &ValidatorContext,
35    ) -> Result<Option<Vec<ValidationError>>, HitError> {
36        if value.len() as u8 > self.length {
37            return Ok(Some(vec![ValidationError {
38                key: MAX_LENGTH.to_string(),
39                level: ValidationErrorLevel::Error,
40                arguments: None,
41            }]));
42        }
43        return Ok(None);
44    }
45
46    fn on_kernel_init(&mut self, _field_name: &str, _model_namee: &str) -> Result<(), HitError> {
47        Ok(())
48    }
49}