valida 1.1.2

Modular validation system for Rust with support for nested structures and localization.
Documentation
use crate::core::contract::IValidate;
use crate::core::field_builder::main::FieldBuilder;
use crate::core::nested_wrapper::{
    NestedArcOptionValidatorWrapper, NestedArcValidatorWrapper, NestedMapValidatorWrapper,
    NestedOptionValidatorWrapper, NestedValidatorWrapper, NestedVecValidatorWrapper,
};
use crate::core::rules::nested::NestedField;
use std::collections::HashMap;
use std::error::Error;
use std::hash::Hash;
use std::marker::PhantomData;
use std::sync::Arc;

impl<'a, T, V, E> NestedField<V, E> for FieldBuilder<'a, T, V, E>
where
    T: Send + Sync + 'static,
    V: Send + Sync + 'static,
    E: Error + Send + Sync + 'static,
{
    fn nested<TValidator>(self, validator: TValidator) -> Self
    where
        TValidator: IValidate<V, E> + 'static,
    {
        let wrapper = Box::new(NestedValidatorWrapper::<T, V, E> {
            field_name: self.rules.field_name,
            accessor: self.rules.accessor.clone(),
            inner: Box::new(validator),
            _phantom: PhantomData,
        });

        self.rules_builder
            .nested
            .insert(self.rules.field_name.to_string(), wrapper);

        self
    }
}

impl<'a, T, V, E> NestedField<V, E> for FieldBuilder<'a, T, Vec<V>, E>
where
    T: Send + Sync + 'static,
    V: Send + Sync + 'static,
    E: Error + Send + Sync + 'static,
{
    fn nested<TValidator>(self, validator: TValidator) -> Self
    where
        TValidator: IValidate<V, E> + 'static,
    {
        let wrapper = Box::new(NestedVecValidatorWrapper::<T, V, E> {
            field_name: self.rules.field_name,
            accessor: self.rules.accessor.clone(),
            inner: Box::new(validator),
            _phantom: PhantomData,
        });

        self.rules_builder
            .nested
            .insert(self.rules.field_name.to_string(), wrapper);

        self
    }
}

impl<'a, T, K, V, E> NestedField<V, E> for FieldBuilder<'a, T, HashMap<K, V>, E>
where
    T: Send + Sync + 'static,
    K: Eq + Hash + ToString + Send + Sync + 'static,
    V: Send + Sync + 'static,
    E: Error + Send + Sync + 'static,
{
    fn nested<TValidator>(self, validator: TValidator) -> Self
    where
        TValidator: IValidate<V, E> + 'static,
    {
        let wrapper = Box::new(NestedMapValidatorWrapper::<T, K, V, E> {
            field_name: self.rules.field_name,
            accessor: self.rules.accessor.clone(),
            inner: Box::new(validator),
            _phantom: PhantomData,
        });

        self.rules_builder
            .nested
            .insert(self.rules.field_name.to_string(), wrapper);

        self
    }
}

impl<'a, T, V, E> NestedField<V, E> for FieldBuilder<'a, T, Option<V>, E>
where
    T: Send + Sync + 'static,
    V: Send + Sync + 'static,
    E: Error + Send + Sync + 'static,
{
    fn nested<TValidator>(self, validator: TValidator) -> Self
    where
        TValidator: IValidate<V, E> + 'static,
    {
        let accessor = self.rules.accessor.clone();

        let wrapper = Box::new(NestedOptionValidatorWrapper::<T, V, E> {
            field_name: self.rules.field_name,
            accessor,
            inner: Box::new(validator),
            _phantom: PhantomData,
        });

        self.rules_builder
            .nested
            .insert(self.rules.field_name.to_string(), wrapper);

        self
    }
}

impl<'a, T, V, E> NestedField<V, E> for FieldBuilder<'a, T, Arc<V>, E>
where
    T: Send + Sync + 'static,
    V: Send + Sync + 'static,
    E: Error + Send + Sync + 'static,
{
    fn nested<TValidator>(self, validator: TValidator) -> Self
    where
        TValidator: IValidate<V, E> + 'static,
    {
        let wrapper = Box::new(NestedArcValidatorWrapper::<T, V, E> {
            field_name: self.rules.field_name,
            accessor: self.rules.accessor.clone(),
            inner: Box::new(validator),
            _phantom: PhantomData,
        });

        self.rules_builder
            .nested
            .insert(self.rules.field_name.to_string(), wrapper);

        self
    }
}

impl<'a, T, V, E> NestedField<V, E> for FieldBuilder<'a, T, Arc<Option<V>>, E>
where
    T: Send + Sync + 'static,
    V: Send + Sync + 'static,
    E: Error + Send + Sync + 'static,
{
    fn nested<TValidator>(self, validator: TValidator) -> Self
    where
        TValidator: IValidate<V, E> + 'static,
    {
        let wrapper = Box::new(NestedArcOptionValidatorWrapper::<T, V, E> {
            field_name: self.rules.field_name,
            accessor: self.rules.accessor.clone(),
            inner: Box::new(validator),
            _phantom: PhantomData,
        });

        self.rules_builder
            .nested
            .insert(self.rules.field_name.to_string(), wrapper);

        self
    }
}