serde_valid_derive 2.0.2

JSON Schema based validation tool using serde.
Documentation
use crate::attribute::Validator;
use crate::types::Field;
use crate::warning::WithWarnings;
use quote::quote;
use std::borrow::Cow;
use std::iter::FromIterator;

pub struct FieldValidators<'a, F: Field + Clone + 'a> {
    field: Cow<'a, F>,
    validators: Vec<Validator>,
    pub warnings: Vec<crate::warning::Warning>,
}

impl<'a, F: Field + Clone> FieldValidators<'a, F> {
    pub fn new(field: Cow<'a, F>, validators: Vec<WithWarnings<Validator>>) -> Self {
        Self {
            field,
            validators: validators.iter().map(|v| v.data.clone()).collect(),
            warnings: validators.into_iter().flat_map(|v| v.warnings).collect(),
        }
    }

    pub fn ident(&self) -> &syn::Ident {
        self.field.ident()
    }

    pub fn is_empty(&self) -> bool {
        self.validators.is_empty()
    }

    pub fn get_tokens(&self) -> Option<Validator> {
        if !self.validators.is_empty() {
            let validators = Validator::from_iter(self.validators.clone());
            Some(quote! (#validators))
        } else {
            None
        }
    }

    pub fn get_field_variable_token(&self) -> Validator {
        let field_ident = self.field.ident();
        let field_getter = self.field.getter_token();
        quote!(
            let #field_ident = &self.#field_getter;
        )
    }

    pub fn generate_tokens(&self) -> Validator {
        let normal_tokens = self.get_tokens();

        if normal_tokens.is_some() {
            let field_variable_token = self.get_field_variable_token();
            quote!(
                #field_variable_token
                #normal_tokens
            )
        } else {
            quote!()
        }
    }
}