use serde_json::Value;
use crate::error::VldError;
use crate::schema::VldSchema;
pub struct ZMessage<T: VldSchema> {
inner: T,
msg: String,
}
impl<T: VldSchema> ZMessage<T> {
fn relabel(&self, mut err: VldError) -> VldError {
for issue in &mut err.issues {
issue.message = self.msg.clone();
}
err
}
pub fn new(inner: T, msg: impl Into<String>) -> Self {
Self {
inner,
msg: msg.into(),
}
}
pub fn inner_schema(&self) -> &T {
&self.inner
}
}
impl<T: VldSchema> VldSchema for ZMessage<T> {
type Output = T::Output;
fn parse_value(&self, value: &Value) -> Result<T::Output, VldError> {
self.inner.parse_value(value).map_err(|e| self.relabel(e))
}
fn parse_missing(&self) -> Result<T::Output, VldError> {
self.inner.parse_missing().map_err(|e| self.relabel(e))
}
fn output_json(&self, o: &Self::Output) -> Option<Value> {
self.inner.output_json(o)
}
}