validify_derive 2.0.0

Derive macros for the validify crate
Documentation
use quote::quote;
use syn::DeriveInput;

pub fn impl_payload(input: &DeriveInput) -> proc_macro2::TokenStream {
    let ident = &input.ident;
    let strct = super::generate_struct(input);
    let payload_id = super::payload_ident(ident);

    let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();

    quote!(
        #strct

        impl #impl_generics ::validify::ValidifyPayload for #ident #ty_generics #where_clause {
            type Payload = #payload_id;

            fn validate_from(payload: Self::Payload) -> Result<Self, ::validify::ValidationErrors>
            {
                <Self::Payload as ::validify::Validate>::validate(&payload)?;

                let mut this = #ident ::from(payload);

                let mut errors = ::validify::ValidationErrors::new();

                if let Err(errs) = <#ident as ::validify::Validate>::validate(&this) {
                    errors.merge(errs);
                }

                if !errors.is_empty() {
                    Err(errors)
                } else {
                    Ok(this)
                }
            }

            fn validify_from(payload: Self::Payload) -> Result<Self, ::validify::ValidationErrors>
            {
                <Self::Payload as ::validify::Validate>::validate(&payload)?;

                let mut this = #ident ::from(payload);

                let mut errors = ::validify::ValidationErrors::new();

                if let Err(errs) = <#ident as ::validify::Validify>::validify(&mut this) {
                    errors.merge(errs);
                }

                if !errors.is_empty() {
                    Err(errors)
                } else {
                    Ok(this)
                }
            }
        }
    )
}