kenzu 0.0.9

Procedural macros for builder pattern generation and validation
Documentation
use super::prelude::*;
use mokuya::components::prelude::*;
use proc_macro2::TokenStream;
use quote::quote;
use syn::{DeriveInput, Field};

pub fn validator_range(input: &DeriveInput, field: &Field) -> TokenStream {
    let field_name = field.ident.as_ref().expect("field_name must be set");
    let attributes = get_attributes(input);
    let range = get_range(attributes);

    let mut validation_code = TokenStream::new();

    // Check for min and max value and error message.
    if let (Some(min_ts), Some(max_ts), Some(min_error), Some(_)) =
        (&range.min, &range.max, &range.err_min, &range.err_max)
    {
        // Add a runtime check to ensure min is not greater than max.
        validation_code.extend(quote! {
            if #min_ts > #max_ts {
                return Err(#min_error); // Or a custom error for range
            }
        });
    }

    if let (Some(min_ts), Some(min_error)) = (&range.min, &range.err_min) {
        validation_code.extend(quote! {
            if self.#field_name < #min_ts {
                return Err(#min_error.into());
            }
        });
    }

    if let (Some(max_ts), Some(max_error)) = (&range.max, &range.err_max) {
        validation_code.extend(quote! {
            if self.#field_name > #max_ts {
                return Err(#max_error.into());
            }
        });
    }

    validation_code
}