Skip to main content

vld/combinators/
message.rs

1use serde_json::Value;
2
3use crate::error::VldError;
4use crate::schema::VldSchema;
5
6/// Override the error message for an inner schema.
7///
8/// Created via [`VldSchema::message()`]. On validation failure the **first**
9/// issue's message is replaced; if the schema produces multiple issues they
10/// are all replaced.
11///
12/// # Example
13/// ```
14/// use vld::prelude::*;
15///
16/// let schema = vld::string().min(3).message("Too short");
17/// let err = schema.parse(r#""ab""#).unwrap_err();
18/// assert_eq!(err.issues[0].message, "Too short");
19/// ```
20pub struct ZMessage<T: VldSchema> {
21    inner: T,
22    msg: String,
23}
24
25impl<T: VldSchema> ZMessage<T> {
26    pub fn new(inner: T, msg: impl Into<String>) -> Self {
27        Self {
28            inner,
29            msg: msg.into(),
30        }
31    }
32}
33
34impl<T: VldSchema> VldSchema for ZMessage<T> {
35    type Output = T::Output;
36
37    fn parse_value(&self, value: &Value) -> Result<T::Output, VldError> {
38        self.inner.parse_value(value).map_err(|mut err| {
39            for issue in &mut err.issues {
40                issue.message = self.msg.clone();
41            }
42            err
43        })
44    }
45}