use serde_json::Value;
use crate::error::VldError;
use crate::schema::VldSchema;
pub struct ZSuperRefine<T, F>
where
T: VldSchema,
F: Fn(&T::Output, &mut VldError),
{
inner: T,
check: F,
}
impl<T, F> ZSuperRefine<T, F>
where
T: VldSchema,
F: Fn(&T::Output, &mut VldError),
{
pub fn new(inner: T, check: F) -> Self {
Self { inner, check }
}
}
impl<T, F> VldSchema for ZSuperRefine<T, F>
where
T: VldSchema,
F: Fn(&T::Output, &mut VldError),
{
type Output = T::Output;
fn parse_value(&self, value: &Value) -> Result<T::Output, VldError> {
let result = self.inner.parse_value(value)?;
let mut errors = VldError::new();
(self.check)(&result, &mut errors);
if errors.is_empty() {
Ok(result)
} else {
Err(errors)
}
}
}