diff options
Diffstat (limited to 'validator_derive/src/validation.rs')
| -rw-r--r-- | validator_derive/src/validation.rs | 131 | 
1 files changed, 69 insertions, 62 deletions
| diff --git a/validator_derive/src/validation.rs b/validator_derive/src/validation.rs index be8afee..37a2d5a 100644 --- a/validator_derive/src/validation.rs +++ b/validator_derive/src/validation.rs @@ -2,7 +2,7 @@ use syn;  use validator::Validator; -use lit::*; +use crate::lit::*;  #[derive(Debug)]  pub struct SchemaValidation { @@ -41,32 +41,33 @@ pub fn extract_length_validation(      for meta_item in meta_items {          if let syn::NestedMeta::Meta(ref item) = *meta_item { -            if let syn::Meta::NameValue(syn::MetaNameValue { ref ident, ref lit, .. }) = *item { -                match ident.to_string().as_ref() { -                    "message" | "code" => continue, -                    "min" => { -                        min = match lit_to_int(lit) { -                            Some(s) => Some(s), -                            None => error("invalid argument type for `min` of `length` validator: only integers are allowed"), -                        }; -                    }, -                    "max" => { -                        max = match lit_to_int(lit) { -                            Some(s) => Some(s), -                            None => error("invalid argument type for `max` of `length` validator: only integers are allowed"), -                        }; -                    }, -                    "equal" => { -                        equal = match lit_to_int(lit) { -                            Some(s) => Some(s), -                            None => error("invalid argument type for `equal` of `length` validator: only integers are allowed"), -                        }; -                    }, -                    v => error(&format!( -                        "unknown argument `{}` for validator `length` (it only has `min`, `max`, `equal`)", -                        v -                    )) -                } +            if let syn::Meta::NameValue(syn::MetaNameValue { ref path, ref lit, .. }) = *item { +                    let ident = path.get_ident().unwrap(); +                    match ident.to_string().as_ref() { +                        "message" | "code" => continue, +                        "min" => { +                            min = match lit_to_int(lit) { +                                Some(s) => Some(s), +                                None => error("invalid argument type for `min` of `length` validator: only integers are allowed"), +                            }; +                        }, +                        "max" => { +                            max = match lit_to_int(lit) { +                                Some(s) => Some(s), +                                None => error("invalid argument type for `max` of `length` validator: only integers are allowed"), +                            }; +                        }, +                        "equal" => { +                            equal = match lit_to_int(lit) { +                                Some(s) => Some(s), +                                None => error("invalid argument type for `equal` of `length` validator: only integers are allowed"), +                            }; +                        }, +                        v => error(&format!( +                            "unknown argument `{}` for validator `length` (it only has `min`, `max`, `equal`)", +                            v +                        )) +                    }              } else {                  panic!(                      "unexpected item {:?} while parsing `length` validator of field {}", @@ -107,7 +108,8 @@ pub fn extract_range_validation(      for meta_item in meta_items {          match *meta_item {              syn::NestedMeta::Meta(ref item) => match *item { -                syn::Meta::NameValue(syn::MetaNameValue { ref ident, ref lit, .. }) => { +                syn::Meta::NameValue(syn::MetaNameValue { ref path, ref lit, .. }) => { +                    let ident = path.get_ident().unwrap();                      match ident.to_string().as_ref() {                          "message" | "code" => continue,                          "min" => { @@ -123,9 +125,9 @@ pub fn extract_range_validation(                              };                          }                          v => error(&format!( -                        "unknown argument `{}` for validator `range` (it only has `min`, `max`)", -                        v -                    )), +                            "unknown argument `{}` for validator `range` (it only has `min`, `max`)", +                            v +                        )),                      }                  }                  _ => panic!("unexpected item {:?} while parsing `range` validator", item), @@ -157,15 +159,16 @@ pub fn extract_argless_validation(      for meta_item in meta_items {          match *meta_item {              syn::NestedMeta::Meta(ref item) => match *item { -                syn::Meta::NameValue(syn::MetaNameValue { ref ident, .. }) => { -                    match ident.to_string().as_ref() { -                        "message" | "code" => continue, -                        v => panic!( -                            "Unknown argument `{}` for validator `{}` on field `{}`", -                            v, validator_name, field -                        ), +                syn::Meta::NameValue(syn::MetaNameValue { ref path, .. }) => { +                        let ident = path.get_ident().unwrap(); +                        match ident.to_string().as_ref() { +                            "message" | "code" => continue, +                            v => panic!( +                                "Unknown argument `{}` for validator `{}` on field `{}`", +                                v, validator_name, field +                            ), +                        }                      } -                }                  _ => panic!("unexpected item {:?} while parsing `range` validator", item),              },              _ => unreachable!(), @@ -203,7 +206,9 @@ pub fn extract_one_arg_validation(      for meta_item in meta_items {          match *meta_item {              syn::NestedMeta::Meta(ref item) => match *item { -                syn::Meta::NameValue(syn::MetaNameValue { ref ident, ref lit, .. }) => { +                syn::Meta::NameValue(syn::MetaNameValue { ref path, ref lit, .. }) => { + +                    let ident = path.get_ident().unwrap();                      match ident.to_string().as_ref() {                          "message" | "code" => continue,                          v if v == val_name => { @@ -259,32 +264,34 @@ fn extract_message_and_code(      for meta_item in meta_items {          if let syn::NestedMeta::Meta(syn::Meta::NameValue(syn::MetaNameValue { -            ref ident, +            ref path,              ref lit,              ..          })) = *meta_item          { -            match ident.to_string().as_ref() { -                "code" => { -                    code = match lit_to_string(lit) { -                        Some(s) => Some(s), -                        None => panic!( -                            "Invalid argument type for `code` for validator `{}` on field `{}`: only a string is allowed", -                            validator_name, field -                        ), -                    }; -                } -                "message" => { -                    message = match lit_to_string(lit) { -                        Some(s) => Some(s), -                        None => panic!( -                            "Invalid argument type for `message` for validator `{}` on field `{}`: only a string is allowed", -                            validator_name, field -                        ), -                    }; -                } -                _ => continue, -            } +                    let ident = path.get_ident().unwrap(); +                    match ident.to_string().as_ref() { +                        "code" => { +                            code = match lit_to_string(lit) { +                                Some(s) => Some(s), +                                None => panic!( +                                    "Invalid argument type for `code` for validator `{}` on field `{}`: only a string is allowed", +                                    validator_name, field +                                ), +                            }; +                        } +                        "message" => { +                            message = match lit_to_string(lit) { +                                Some(s) => Some(s), +                                None => panic!( +                                    "Invalid argument type for `message` for validator `{}` on field `{}`: only a string is allowed", +                                    validator_name, field +                                ), +                            }; +                        } +                        _ => continue, +                    } +          }      } | 
