Skip to main content

vld/combinators/
transform.rs

1use serde_json::Value;
2use std::marker::PhantomData;
3
4use crate::error::VldError;
5use crate::schema::VldSchema;
6
7/// Transforms the output of a schema after successful parsing.
8///
9/// Created via [`VldSchema::transform()`].
10///
11/// # Example
12/// ```
13/// use vld::prelude::*;
14///
15/// // Parse a string, then transform it to its length
16/// let len_schema = vld::string().transform(|s| s.len());
17/// ```
18pub 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    /// Access the inner schema.
42    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}