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}