use crate::error::{ApiError, FieldError};
pub trait Validatable {
fn do_validate(&self) -> Result<(), ApiError>;
}
#[cfg(feature = "legacy-validator")]
impl<T: validator::Validate> Validatable for T {
fn do_validate(&self) -> Result<(), ApiError> {
match validator::Validate::validate(self) {
Ok(_) => Ok(()),
Err(e) => Err(convert_validator_errors(e)),
}
}
}
#[cfg(feature = "legacy-validator")]
pub fn convert_validator_errors(errors: validator::ValidationErrors) -> ApiError {
let field_errors =
errors
.field_errors()
.iter()
.flat_map(|(field, errs)| {
let field_name = field.to_string();
errs.iter().map(move |e| FieldError {
field: field_name.clone(),
code: e.code.to_string(),
message: e.message.clone().map(|m| m.to_string()).unwrap_or_else(|| {
format!("Validation failed for field '{}'", &field_name)
}),
})
})
.collect();
ApiError::validation(field_errors)
}
pub fn convert_v2_errors(errors: rustapi_validate::v2::ValidationErrors) -> ApiError {
let field_errors = errors
.fields
.iter()
.flat_map(|(field, errs)| {
let field_name = field.to_string();
errs.iter().map(move |e| FieldError {
field: field_name.clone(),
code: e.code.to_string(),
message: e.message.clone(),
})
})
.collect();
ApiError::validation(field_errors)
}