use serde_json::Value;
use crate::error::VldError;
use crate::schema::VldSchema;
pub struct ZIntersection<A: VldSchema, B: VldSchema> {
first: A,
second: B,
}
impl<A: VldSchema, B: VldSchema> ZIntersection<A, B> {
pub fn new(first: A, second: B) -> Self {
Self { first, second }
}
pub fn schema_a(&self) -> &A {
&self.first
}
pub fn schema_b(&self) -> &B {
&self.second
}
}
impl<A: VldSchema, B: VldSchema> VldSchema for ZIntersection<A, B> {
type Output = A::Output;
fn parse_value(&self, value: &Value) -> Result<A::Output, VldError> {
let mut errors = VldError::new();
let first_result = match self.first.parse_value(value) {
Ok(v) => Some(v),
Err(e) => {
errors = errors.merge(e);
None
}
};
if let Err(e) = self.second.parse_value(value) {
errors = errors.merge(e);
}
if errors.is_empty() {
Ok(first_result.unwrap())
} else {
Err(errors)
}
}
}