pub mod display;
pub mod transform;
pub mod validate;
use std::fmt::{self, Debug, Display, Write};
use sealed::sealed;
use transform::TransformError;
use validate::ValidateError;
pub trait ErrorShow: Debug + Display {}
impl<T: Debug + Display> ErrorShow for T {}
#[derive(Debug, Default)]
pub struct ValidationError {
pub validates: Vec<ValidateError>,
pub transforms: Vec<TransformError>,
}
impl ValidationError {
pub fn new() -> Self {
Self::default()
}
pub fn check(self) -> Result<(), ValidationError> {
if self.validates.is_empty() && self.transforms.is_empty() {
Ok(())
} else {
Err(self)
}
}
pub fn push_validate_error(&mut self, err: ValidateError) {
self.validates.push(err);
}
pub fn push_transform_error(&mut self, err: TransformError) {
self.transforms.push(err);
}
pub fn extend_error(&mut self, parent: &str, rhs: Self) {
self.validates
.extend(rhs.validates.into_iter().map(|mut x| {
x.path = format!("{}.{}", parent, x.path);
x
}));
self.transforms
.extend(rhs.transforms.into_iter().map(|mut x| {
x.path = format!("{}.{}", parent, x.path);
x
}));
}
}
#[sealed]
impl display::ErrorDisplay for ValidationError {
fn full_display(&self, w: &mut impl Write) -> fmt::Result {
self.validates.iter().try_for_each(|t| t.full_display(w))?;
self.transforms.iter().try_for_each(|t| t.full_display(w))?;
Ok(())
}
fn brief_display(&self, w: &mut impl Write) -> fmt::Result {
self.validates.iter().try_for_each(|t| t.brief_display(w))?;
self.transforms
.iter()
.try_for_each(|t| t.brief_display(w))?;
Ok(())
}
}