1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
use crate::ServiceError; /// The `Validate` trait of the Aragog library. /// This trait provides the possibility to validate an instance or its fields formats or logic. Its main use /// it to validate a new or updated [`Record`] model instance before saving it. /// /// [`Record`]: record/trait.Record.html pub trait Validate { /// Validates the object field formats, logic or anything. Calls the [`validations`] method /// and will render a complete [`ServiceError`]::[`ValidationError`] on validation failure. /// On success returns `()` /// /// [`validations`]: trait.Validate.html#tymethod.validations /// [`ServiceError`]: enum.ServiceError.html /// [`ValidationError`]: enum.ServiceError.html#variant.ValidationError fn validate(&self) -> Result<(), ServiceError> { let mut errors: Vec<String> = Vec::new(); self.validations(&mut errors); if errors.is_empty() { Ok(()) } else { let error_str = errors.join(", "); log::error!("{}", &error_str); Err(ServiceError::ValidationError(error_str)) } } /// Runs all the defined validation on fields and fills the `errors` string vector with custom error messages fn validations(&self, errors: &mut Vec<String>); /// Runs all validations and returns a `false` if they failed, on success `true` is returned fn is_valid(&self) -> bool { match self.validate() { Ok(()) => true, Err(_err) => false } } /// Helper function to simply check the presence of a field. This function is usually used inside the /// [`validations`] method since it will fill the `errors` with a message if the `field` is missing. /// /// # Arguments /// /// * `field_name` - The string slice name of the field, will be used in the error message on failure /// * `field` - Optional value, if `field` is `Some<T>` the function will succeed /// * `errors` - the mutable reference of the error message vector like provided in [`validations`] /// /// # Returns /// /// `true` if `field` is `Some<T>` on failure, `false` is returned and `errors` stored a new message /// /// [`validations`]: trait.Validate.html#tymethod.validations fn validate_field_presence<T>(field_name: &str, field: &Option<T>, errors: &mut Vec<String>) -> bool { match field { Some(_value) => { true } None => { errors.push(format!("{} is missing", field_name)); false } } } /// Helper function to simply check the absence of a field. This function is usually used inside the /// [`validations`] method since it will fill the `errors` with a message if the `field` is missing. /// /// # Arguments /// /// * `field_name` - The string slice name of the field, will be used in the error message on failure /// * `field` - Optional value, if `field` is `None` the function will succeed /// * `errors` - the mutable reference of the error message vector like provided in [`validations`] /// /// # Returns /// /// `true` if `field` is `None` on failure, `false` is returned and `errors` stored a new message /// /// [`validations`]: trait.Validate.html#tymethod.validations fn validate_field_absence<T>(field_name: &str, field: &Option<T>, errors: &mut Vec<String>) -> bool { match field { Some(_value) => { errors.push(format!("{} should not be set", field_name)); false } None => { true } } } }