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    /// Access the inner schema (for nested OpenAPI component collection).
34    pub fn inner_schema(&self) -> &T {
35        &self.inner
36    }
37}
38
39impl<T: VldSchema> VldSchema for ZMessage<T> {
40    type Output = T::Output;
41
42    fn parse_value(&self, value: &Value) -> Result<T::Output, VldError> {
43        self.inner.parse_value(value).map_err(|mut err| {
44            for issue in &mut err.issues {
45                issue.message = self.msg.clone();
46            }
47            err
48        })
49    }
50}