vld/combinators/
transform.rs1use serde_json::Value;
2use std::marker::PhantomData;
3
4use crate::error::VldError;
5use crate::schema::VldSchema;
6
7pub struct ZTransform<T, F, U>
19where
20 T: VldSchema,
21 F: Fn(T::Output) -> U,
22{
23 inner: T,
24 transform_fn: F,
25 _phantom: PhantomData<U>,
26}
27
28impl<T, F, U> ZTransform<T, F, U>
29where
30 T: VldSchema,
31 F: Fn(T::Output) -> U,
32{
33 pub fn new(inner: T, transform_fn: F) -> Self {
34 Self {
35 inner,
36 transform_fn,
37 _phantom: PhantomData,
38 }
39 }
40
41 pub fn inner_schema(&self) -> &T {
43 &self.inner
44 }
45}
46
47impl<T, F, U> VldSchema for ZTransform<T, F, U>
48where
49 T: VldSchema,
50 F: Fn(T::Output) -> U,
51{
52 type Output = U;
53
54 fn parse_value(&self, value: &Value) -> Result<U, VldError> {
55 let result = self.inner.parse_value(value)?;
56 Ok((self.transform_fn)(result))
57 }
58}