use std::collections::HashMap;
use super::error::ValidationError;
use super::rules::FieldValidator;
pub struct Validator {
errors: HashMap<String, Vec<String>>,
}
impl Validator {
pub fn new() -> Self {
Self {
errors: HashMap::new(),
}
}
pub fn field<T>(
mut self,
name: &str,
value: &T,
f: impl FnOnce(FieldValidator<'_, T>) -> FieldValidator<'_, T>,
) -> Self {
let mut field_errors = Vec::new();
let fv = FieldValidator::new(value, &mut field_errors);
f(fv);
if !field_errors.is_empty() {
self.errors
.entry(name.to_string())
.or_default()
.extend(field_errors);
}
self
}
pub fn check(self) -> Result<(), ValidationError> {
if self.errors.is_empty() {
Ok(())
} else {
Err(ValidationError::new(self.errors))
}
}
}
impl Default for Validator {
fn default() -> Self {
Self::new()
}
}