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();
if let (Some(min_ts), Some(max_ts), Some(min_error), Some(_)) =
(&range.min, &range.max, &range.err_min, &range.err_max)
{
validation_code.extend(quote! {
if #min_ts > #max_ts {
return Err(#min_error); }
});
}
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
}