vld/combinators/
custom.rs1use serde_json::Value;
2use std::marker::PhantomData;
3
4use crate::error::{IssueCode, VldError};
5use crate::schema::VldSchema;
6
7pub struct ZCustom<F, T> {
23 check: F,
24 _marker: PhantomData<T>,
25}
26
27impl<F, T> ZCustom<F, T>
28where
29 F: Fn(&Value) -> Result<T, String>,
30{
31 pub fn new(check: F) -> Self {
33 Self {
34 check,
35 _marker: PhantomData,
36 }
37 }
38}
39
40impl<F, T> VldSchema for ZCustom<F, T>
41where
42 F: Fn(&Value) -> Result<T, String>,
43{
44 type Output = T;
45
46 fn parse_value(&self, value: &Value) -> Result<T, VldError> {
47 (self.check)(value).map_err(|msg| {
48 VldError::single_with_value(
49 IssueCode::Custom {
50 code: "custom".to_string(),
51 },
52 msg,
53 value,
54 )
55 })
56 }
57}