From ab93a250013ad01620992581923583cbf93ed3db Mon Sep 17 00:00:00 2001 From: Vincent Prouillet Date: Thu, 13 Sep 2018 18:42:32 +0200 Subject: Rustfmt --- validator_derive/src/asserts.rs | 61 +++++++++++---- validator_derive/src/lib.rs | 148 ++++++++++++++++++++++++------------- validator_derive/src/lit.rs | 11 ++- validator_derive/src/quoting.rs | 106 ++++++++++++++++++-------- validator_derive/src/validation.rs | 117 +++++++++++++++++------------ 5 files changed, 293 insertions(+), 150 deletions(-) (limited to 'validator_derive/src') diff --git a/validator_derive/src/asserts.rs b/validator_derive/src/asserts.rs index cdd0028..1a8dfff 100644 --- a/validator_derive/src/asserts.rs +++ b/validator_derive/src/asserts.rs @@ -5,20 +5,44 @@ lazy_static! { } pub static NUMBER_TYPES: [&'static str; 36] = [ - "usize", "u8", "u16", "u32", "u64", - "isize", "i8", "i16", "i32", "i64", - "f32", "f64", - - "Option", "Option", "Option", "Option", "Option", - "Option", "Option", "Option", "Option", "Option", - "Option", "Option", - - "Option>", "Option>", "Option>", "Option>", "Option>", - "Option>", "Option>", "Option>", "Option>", "Option>", - "Option>", "Option>", + "usize", + "u8", + "u16", + "u32", + "u64", + "isize", + "i8", + "i16", + "i32", + "i64", + "f32", + "f64", + "Option", + "Option", + "Option", + "Option", + "Option", + "Option", + "Option", + "Option", + "Option", + "Option", + "Option", + "Option", + "Option>", + "Option>", + "Option>", + "Option>", + "Option>", + "Option>", + "Option>", + "Option>", + "Option>", + "Option>", + "Option>", + "Option>", ]; - pub fn assert_string_type(name: &str, field_type: &String) { if field_type != "String" && field_type != "&str" @@ -26,8 +50,12 @@ pub fn assert_string_type(name: &str, field_type: &String) { && field_type != "Option" && field_type != "Option>" && !(field_type.starts_with("Option<") && field_type.ends_with("str>")) - && !(field_type.starts_with("Option>")) { - panic!("`{}` validator can only be used on String, &str, Cow<'_,str> or an Option of those", name); + && !(field_type.starts_with("Option>")) + { + panic!( + "`{}` validator can only be used on String, &str, Cow<'_,str> or an Option of those", + name + ); } } @@ -52,8 +80,9 @@ pub fn assert_has_len(field_name: String, field_type: &String) { && !(field_type.starts_with("Option<") && field_type.ends_with("str>")) && !(field_type.starts_with("Option>")) && !COW_TYPE.is_match(field_type) - && field_type != "&str" { - panic!( + && field_type != "&str" + { + panic!( "Validator `length` can only be used on types `String`, `&str`, Cow<'_,str> or `Vec` but found `{}` for field `{}`", field_type, field_name ); diff --git a/validator_derive/src/lib.rs b/validator_derive/src/lib.rs index 2a23ba4..0647a7d 100644 --- a/validator_derive/src/lib.rs +++ b/validator_derive/src/lib.rs @@ -18,17 +18,15 @@ use quote::ToTokens; use std::collections::HashMap; use validator::Validator; - -mod lit; -mod validation; mod asserts; +mod lit; mod quoting; +mod validation; +use asserts::{assert_has_len, assert_has_range, assert_string_type, assert_type_matches}; use lit::*; +use quoting::{quote_field_validation, quote_schema_validation, FieldQuoter}; use validation::*; -use asserts::{assert_string_type, assert_type_matches, assert_has_len, assert_has_range}; -use quoting::{FieldQuoter, quote_field_validation, quote_schema_validation}; - #[proc_macro_derive(Validate, attributes(validate))] pub fn derive_validation(input: TokenStream) -> TokenStream { @@ -36,7 +34,6 @@ pub fn derive_validation(input: TokenStream) -> TokenStream { impl_validate(&ast).into() } - fn impl_validate(ast: &syn::DeriveInput) -> proc_macro2::TokenStream { // Ensure the macro is on a struct with named fields let fields = match ast.data { @@ -45,7 +42,7 @@ fn impl_validate(ast: &syn::DeriveInput) -> proc_macro2::TokenStream { panic!("struct has unnamed fields"); } fields.iter().cloned().collect() - }, + } _ => panic!("#[derive(Validate)] can only be used with structs"), }; @@ -61,7 +58,12 @@ fn impl_validate(ast: &syn::DeriveInput) -> proc_macro2::TokenStream { let field_quoter = FieldQuoter::new(field_ident, name, field_type); for validation in &field_validations { - quote_field_validation(&field_quoter, validation, &mut validations, &mut nested_validations); + quote_field_validation( + &field_quoter, + validation, + &mut validations, + &mut nested_validations, + ); } } @@ -96,7 +98,6 @@ fn impl_validate(ast: &syn::DeriveInput) -> proc_macro2::TokenStream { impl_ast } - /// Find if a struct has some schema validation and returns the info if so fn find_struct_validation(struct_attrs: &Vec) -> Option { let error = |msg: &str| -> ! { @@ -187,7 +188,6 @@ fn find_struct_validation(struct_attrs: &Vec) -> Option) -> HashMap { @@ -200,8 +200,7 @@ fn find_fields_type(fields: &Vec) -> HashMap { let mut tokens = proc_macro2::TokenStream::new(); path.to_tokens(&mut tokens); tokens.to_string().replace(' ', "") - - }, + } syn::Type::Reference(syn::TypeReference { ref lifetime, ref elem, .. }) => { let mut tokens = proc_macro2::TokenStream::new(); elem.to_tokens(&mut tokens); @@ -210,8 +209,8 @@ fn find_fields_type(fields: &Vec) -> HashMap { name.insert(0, '&') } name - }, - _ => panic!("Type `{:?}` of field `{}` not supported", field.ty, field_ident) + } + _ => panic!("Type `{:?}` of field `{}` not supported", field.ty, field_ident), }; //println!("{:?}", field_type); @@ -223,12 +222,19 @@ fn find_fields_type(fields: &Vec) -> HashMap { /// Find everything we need to know about a field: its real name if it's changed from the serialization /// and the list of validators to run on it -fn find_validators_for_field(field: &syn::Field, field_types: &HashMap) -> (String, Vec) { +fn find_validators_for_field( + field: &syn::Field, + field_types: &HashMap, +) -> (String, Vec) { let rust_ident = field.ident.clone().unwrap().to_string(); let mut field_ident = field.ident.clone().unwrap().to_string(); let error = |msg: &str| -> ! { - panic!("Invalid attribute #[validate] on field `{}`: {}", field.ident.clone().unwrap().to_string(), msg); + panic!( + "Invalid attribute #[validate] on field `{}`: {}", + field.ident.clone().unwrap().to_string(), + msg + ); }; let field_type = field_types.get(&field_ident).unwrap(); @@ -265,38 +271,40 @@ fn find_validators_for_field(field: &syn::Field, field_types: &HashMap { assert_string_type("email", field_type); validators.push(FieldValidation::new(Validator::Email)); - }, + } "url" => { assert_string_type("url", field_type); validators.push(FieldValidation::new(Validator::Url)); - }, + } #[cfg(feature = "phone")] "phone" => { assert_string_type("phone", field_type); validators.push(FieldValidation::new(Validator::Phone)); - }, + } #[cfg(feature = "card")] "credit_card" => { assert_string_type("credit_card", field_type); validators.push(FieldValidation::new(Validator::CreditCard)); - }, - _ => panic!("Unexpected validator: {}", name) + } + _ => panic!("Unexpected validator: {}", name), }, // custom, contains, must_match, regex - syn::Meta::NameValue(syn::MetaNameValue { ref ident, ref lit, .. }) => { + syn::Meta::NameValue(syn::MetaNameValue { + ref ident, ref lit, .. + }) => { match ident.to_string().as_ref() { "custom" => { match lit_to_string(lit) { Some(s) => validators.push(FieldValidation::new(Validator::Custom(s))), None => error("invalid argument for `custom` validator: only strings are allowed"), }; - }, + } "contains" => { match lit_to_string(lit) { Some(s) => validators.push(FieldValidation::new(Validator::Contains(s))), None => error("invalid argument for `contains` validator: only strings are allowed"), }; - }, + } "regex" => { match lit_to_string(lit) { Some(s) => validators.push(FieldValidation::new(Validator::Regex(s))), @@ -311,53 +319,88 @@ fn find_validators_for_field(field: &syn::Field, field_types: &HashMap error("invalid argument for `must_match` validator: only strings are allowed"), }; - }, + } v => panic!("unexpected name value validator: {:?}", v), }; - }, + } // Validators with several args syn::Meta::List(syn::MetaList { ref ident, ref nested, .. }) => { let meta_items = nested.iter().cloned().collect(); match ident.to_string().as_ref() { "length" => { assert_has_len(rust_ident.clone(), field_type); - validators.push(extract_length_validation(rust_ident.clone(), &meta_items)); - }, + validators.push(extract_length_validation( + rust_ident.clone(), + &meta_items, + )); + } "range" => { assert_has_range(rust_ident.clone(), field_type); - validators.push(extract_range_validation(rust_ident.clone(), &meta_items)); - }, + validators.push(extract_range_validation( + rust_ident.clone(), + &meta_items, + )); + } "email" | "url" | "phone" | "credit_card" => { - validators.push(extract_argless_validation(ident.to_string(), rust_ident.clone(), &meta_items)); - }, + validators.push(extract_argless_validation( + ident.to_string(), + rust_ident.clone(), + &meta_items, + )); + } "custom" => { - validators.push(extract_one_arg_validation("function", ident.to_string(), rust_ident.clone(), &meta_items)); - }, + validators.push(extract_one_arg_validation( + "function", + ident.to_string(), + rust_ident.clone(), + &meta_items, + )); + } "contains" => { - validators.push(extract_one_arg_validation("pattern", ident.to_string(), rust_ident.clone(), &meta_items)); - }, + validators.push(extract_one_arg_validation( + "pattern", + ident.to_string(), + rust_ident.clone(), + &meta_items, + )); + } "regex" => { - validators.push(extract_one_arg_validation("path", ident.to_string(), rust_ident.clone(), &meta_items)); - }, + validators.push(extract_one_arg_validation( + "path", + ident.to_string(), + rust_ident.clone(), + &meta_items, + )); + } "must_match" => { - let validation = extract_one_arg_validation("other", ident.to_string(), rust_ident.clone(), &meta_items); + let validation = extract_one_arg_validation( + "other", + ident.to_string(), + rust_ident.clone(), + &meta_items, + ); if let Validator::MustMatch(ref t2) = validation.validator { - assert_type_matches(rust_ident.clone(), field_type, field_types.get(t2)); + assert_type_matches( + rust_ident.clone(), + field_type, + field_types.get(t2), + ); } validators.push(validation); - }, - v => panic!("unexpected list validator: {:?}", v) + } + v => panic!("unexpected list validator: {:?}", v), } - }, + } }, - _ => unreachable!("Found a non Meta while looking for validators") + _ => unreachable!("Found a non Meta while looking for validators"), }; } - }, - Some(syn::Meta::Word(_)) => { - validators.push(FieldValidation::new(Validator::Nested)) - }, - _ => unreachable!("Got something other than a list of attributes while checking field `{}`", field_ident), + } + Some(syn::Meta::Word(_)) => validators.push(FieldValidation::new(Validator::Nested)), + _ => unreachable!( + "Got something other than a list of attributes while checking field `{}`", + field_ident + ), } } @@ -384,12 +427,12 @@ fn find_original_field_name(meta_items: &Vec<&syn::NestedMeta>) -> Option { return find_original_field_name(&nested.iter().collect()); } }, - _ => unreachable!() + _ => unreachable!(), }; if original_name.is_some() { @@ -399,4 +442,3 @@ fn find_original_field_name(meta_items: &Vec<&syn::NestedMeta>) -> Option Option { match *lit { @@ -32,7 +31,11 @@ pub fn lit_to_bool(lit: &syn::Lit) -> Option { match *lit { syn::Lit::Bool(ref s) => Some(s.value), // TODO: remove when attr_literals is stable - syn::Lit::Str(ref s) => if s.value() == "true" { Some(true) } else { Some(false) }, + syn::Lit::Str(ref s) => if s.value() == "true" { + Some(true) + } else { + Some(false) + }, _ => None, } } @@ -40,6 +43,6 @@ pub fn lit_to_bool(lit: &syn::Lit) -> Option { pub fn option_u64_to_tokens(opt: Option) -> proc_macro2::TokenStream { match opt { Some(ref t) => quote!(::std::option::Option::Some(#t)), - None => quote!(::std::option::Option::None) + None => quote!(::std::option::Option::None), } } diff --git a/validator_derive/src/quoting.rs b/validator_derive/src/quoting.rs index b47db6a..f94d8fc 100644 --- a/validator_derive/src/quoting.rs +++ b/validator_derive/src/quoting.rs @@ -1,11 +1,10 @@ -use validator::Validator; -use syn; use proc_macro2::{self, Span}; +use syn; +use validator::Validator; +use asserts::{COW_TYPE, NUMBER_TYPES}; use lit::option_u64_to_tokens; use validation::{FieldValidation, SchemaValidation}; -use asserts::{COW_TYPE, NUMBER_TYPES}; - /// Pass around all the information needed for creating a validation #[derive(Debug)] @@ -54,8 +53,10 @@ impl FieldQuoter { pub fn get_optional_validator_param(&self) -> proc_macro2::TokenStream { let ident = &self.ident; - if self._type.starts_with("Option<&") || self._type.starts_with("Option proc_macro2::TokenStream { @@ -99,7 +99,7 @@ impl FieldQuoter { result }).collect(); result = ::validator::ValidationErrors::merge_all(result, #field_name, results); - }) + }); } tokens @@ -121,8 +121,10 @@ fn quote_error(validation: &FieldValidation) -> proc_macro2::TokenStream { ) } - -pub fn quote_length_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream { +pub fn quote_length_validation( + field_quoter: &FieldQuoter, + validation: &FieldValidation, +) -> proc_macro2::TokenStream { let field_name = &field_quoter.name; let validator_param = field_quoter.quote_validator_param(); @@ -173,7 +175,10 @@ pub fn quote_length_validation(field_quoter: &FieldQuoter, validation: &FieldVal unreachable!() } -pub fn quote_range_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream { +pub fn quote_range_validation( + field_quoter: &FieldQuoter, + validation: &FieldValidation, +) -> proc_macro2::TokenStream { let field_name = &field_quoter.name; let quoted_ident = field_quoter.quote_validator_param(); @@ -201,7 +206,10 @@ pub fn quote_range_validation(field_quoter: &FieldQuoter, validation: &FieldVali } #[cfg(feature = "card")] -pub fn quote_credit_card_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream { +pub fn quote_credit_card_validation( + field_quoter: &FieldQuoter, + validation: &FieldValidation, +) -> proc_macro2::TokenStream { let field_name = &field_quoter.name; let validator_param = field_quoter.quote_validator_param(); @@ -218,7 +226,10 @@ pub fn quote_credit_card_validation(field_quoter: &FieldQuoter, validation: &Fie } #[cfg(feature = "phone")] -pub fn quote_phone_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream { +pub fn quote_phone_validation( + field_quoter: &FieldQuoter, + validation: &FieldValidation, +) -> proc_macro2::TokenStream { let field_name = &field_quoter.name; let validator_param = field_quoter.quote_validator_param(); @@ -234,7 +245,10 @@ pub fn quote_phone_validation(field_quoter: &FieldQuoter, validation: &FieldVali field_quoter.wrap_if_option(quoted) } -pub fn quote_url_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream { +pub fn quote_url_validation( + field_quoter: &FieldQuoter, + validation: &FieldValidation, +) -> proc_macro2::TokenStream { let field_name = &field_quoter.name; let validator_param = field_quoter.quote_validator_param(); @@ -250,7 +264,10 @@ pub fn quote_url_validation(field_quoter: &FieldQuoter, validation: &FieldValida field_quoter.wrap_if_option(quoted) } -pub fn quote_email_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream { +pub fn quote_email_validation( + field_quoter: &FieldQuoter, + validation: &FieldValidation, +) -> proc_macro2::TokenStream { let field_name = &field_quoter.name; let validator_param = field_quoter.quote_validator_param(); @@ -266,7 +283,10 @@ pub fn quote_email_validation(field_quoter: &FieldQuoter, validation: &FieldVali field_quoter.wrap_if_option(quoted) } -pub fn quote_must_match_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream { +pub fn quote_must_match_validation( + field_quoter: &FieldQuoter, + validation: &FieldValidation, +) -> proc_macro2::TokenStream { let ident = &field_quoter.ident; let field_name = &field_quoter.name; @@ -288,7 +308,10 @@ pub fn quote_must_match_validation(field_quoter: &FieldQuoter, validation: &Fiel unreachable!(); } -pub fn quote_custom_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream { +pub fn quote_custom_validation( + field_quoter: &FieldQuoter, + validation: &FieldValidation, +) -> proc_macro2::TokenStream { let field_name = &field_quoter.name; let validator_param = field_quoter.quote_validator_param(); @@ -317,7 +340,10 @@ pub fn quote_custom_validation(field_quoter: &FieldQuoter, validation: &FieldVal unreachable!(); } -pub fn quote_contains_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream { +pub fn quote_contains_validation( + field_quoter: &FieldQuoter, + validation: &FieldValidation, +) -> proc_macro2::TokenStream { let field_name = &field_quoter.name; let validator_param = field_quoter.quote_validator_param(); @@ -338,7 +364,10 @@ pub fn quote_contains_validation(field_quoter: &FieldQuoter, validation: &FieldV unreachable!(); } -pub fn quote_regex_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> proc_macro2::TokenStream { +pub fn quote_regex_validation( + field_quoter: &FieldQuoter, + validation: &FieldValidation, +) -> proc_macro2::TokenStream { let field_name = &field_quoter.name; let validator_param = field_quoter.quote_validator_param(); @@ -359,27 +388,42 @@ pub fn quote_regex_validation(field_quoter: &FieldQuoter, validation: &FieldVali unreachable!(); } -pub fn quote_nested_validation(field_quoter: &FieldQuoter) -> proc_macro2::TokenStream { +pub fn quote_nested_validation(field_quoter: &FieldQuoter) -> proc_macro2::TokenStream { let field_name = &field_quoter.name; let validator_field = field_quoter.quote_validator_field(); let quoted = quote!(result = ::validator::ValidationErrors::merge(result, #field_name, #validator_field.validate());); field_quoter.wrap_if_option(field_quoter.wrap_if_vector(quoted)) } -pub fn quote_field_validation(field_quoter: &FieldQuoter, validation: &FieldValidation, - validations: &mut Vec, - nested_validations: &mut Vec) { +pub fn quote_field_validation( + field_quoter: &FieldQuoter, + validation: &FieldValidation, + validations: &mut Vec, + nested_validations: &mut Vec, +) { match validation.validator { - Validator::Length {..} => validations.push(quote_length_validation(&field_quoter, validation)), - Validator::Range {..} => validations.push(quote_range_validation(&field_quoter, validation)), + Validator::Length { .. } => { + validations.push(quote_length_validation(&field_quoter, validation)) + } + Validator::Range { .. } => { + validations.push(quote_range_validation(&field_quoter, validation)) + } Validator::Email => validations.push(quote_email_validation(&field_quoter, validation)), Validator::Url => validations.push(quote_url_validation(&field_quoter, validation)), - Validator::MustMatch(_) => validations.push(quote_must_match_validation(&field_quoter, validation)), - Validator::Custom(_) => validations.push(quote_custom_validation(&field_quoter, validation)), - Validator::Contains(_) => validations.push(quote_contains_validation(&field_quoter, validation)), + Validator::MustMatch(_) => { + validations.push(quote_must_match_validation(&field_quoter, validation)) + } + Validator::Custom(_) => { + validations.push(quote_custom_validation(&field_quoter, validation)) + } + Validator::Contains(_) => { + validations.push(quote_contains_validation(&field_quoter, validation)) + } Validator::Regex(_) => validations.push(quote_regex_validation(&field_quoter, validation)), #[cfg(feature = "card")] - Validator::CreditCard => validations.push(quote_credit_card_validation(&field_quoter, validation)), + Validator::CreditCard => { + validations.push(quote_credit_card_validation(&field_quoter, validation)) + } #[cfg(feature = "phone")] Validator::Phone => validations.push(quote_phone_validation(&field_quoter, validation)), Validator::Nested => nested_validations.push(quote_nested_validation(&field_quoter)), diff --git a/validator_derive/src/validation.rs b/validator_derive/src/validation.rs index 227b9d9..a9762db 100644 --- a/validator_derive/src/validation.rs +++ b/validator_derive/src/validation.rs @@ -4,7 +4,6 @@ use validator::Validator; use lit::*; - #[derive(Debug)] pub struct SchemaValidation { pub function: String, @@ -13,7 +12,6 @@ pub struct SchemaValidation { pub message: Option, } - #[derive(Debug)] pub struct FieldValidation { pub code: String, @@ -23,15 +21,14 @@ pub struct FieldValidation { impl FieldValidation { pub fn new(validator: Validator) -> FieldValidation { - FieldValidation { - code: validator.code().to_string(), - validator, - message: None, - } + FieldValidation { code: validator.code().to_string(), validator, message: None } } } -pub fn extract_length_validation(field: String, meta_items: &Vec) -> FieldValidation { +pub fn extract_length_validation( + field: String, + meta_items: &Vec, +) -> FieldValidation { let mut min = None; let mut max = None; let mut equal = None; @@ -71,7 +68,10 @@ pub fn extract_length_validation(field: String, meta_items: &Vec) -> FieldValidation { +pub fn extract_range_validation( + field: String, + meta_items: &Vec, +) -> FieldValidation { let mut min = 0.0; let mut max = 0.0; let (message, code) = extract_message_and_code("range", &field, meta_items); - + let error = |msg: &str| -> ! { panic!("Invalid attribute #[validate] on field `{}`: {}", field, msg); }; @@ -108,32 +111,33 @@ pub fn extract_range_validation(field: String, meta_items: &Vec 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, .. }) => { - match ident.to_string().as_ref() { - "message" | "code" => continue, - "min" => { - min = match lit_to_float(lit) { + syn::Meta::NameValue(syn::MetaNameValue { ref ident, ref lit, .. }) => match ident + .to_string() + .as_ref() + { + "message" | "code" => continue, + "min" => { + min = match lit_to_float(lit) { Some(s) => s, None => error("invalid argument type for `min` of `range` validator: only integers are allowed") }; - has_min = true; - }, - "max" => { - max = match lit_to_float(lit) { + has_min = true; + } + "max" => { + max = match lit_to_float(lit) { Some(s) => s, None => error("invalid argument type for `max` of `range` validator: only integers are allowed") }; - has_max = true; - }, - v => error(&format!( - "unknown argument `{}` for validator `range` (it only has `min`, `max`)", - v - )) + has_max = true; } + v => error(&format!( + "unknown argument `{}` for validator `range` (it only has `min`, `max`)", + v + )), }, - _ => panic!("unexpected item {:?} while parsing `range` validator", item) + _ => panic!("unexpected item {:?} while parsing `range` validator", item), }, - _=> unreachable!() + _ => unreachable!(), } } @@ -150,7 +154,11 @@ pub fn extract_range_validation(field: String, meta_items: &Vec } /// Extract url/email/phone field validation with a code or a message -pub fn extract_argless_validation(validator_name: String, field: String, meta_items: &Vec) -> FieldValidation { +pub fn extract_argless_validation( + validator_name: String, + field: String, + meta_items: &Vec, +) -> FieldValidation { let (message, code) = extract_message_and_code(&validator_name, &field, meta_items); for meta_item in meta_items { @@ -162,12 +170,12 @@ pub fn extract_argless_validation(validator_name: String, field: String, meta_it v => panic!( "Unknown argument `{}` for validator `{}` on field `{}`", v, validator_name, field - ) + ), } - }, - _ => panic!("unexpected item {:?} while parsing `range` validator", item) + } + _ => panic!("unexpected item {:?} while parsing `range` validator", item), }, - _=> unreachable!() + _ => unreachable!(), } } @@ -177,7 +185,7 @@ pub fn extract_argless_validation(validator_name: String, field: String, meta_it "credit_card" => Validator::CreditCard, #[cfg(feature = "phone")] "phone" => Validator::Phone, - _ => Validator::Url + _ => Validator::Url, }; FieldValidation { @@ -188,7 +196,12 @@ pub fn extract_argless_validation(validator_name: String, field: String, meta_it } /// For custom, contains, regex, must_match -pub fn extract_one_arg_validation(val_name: &str, validator_name: String, field: String, meta_items: &Vec) -> FieldValidation { +pub fn extract_one_arg_validation( + val_name: &str, + validator_name: String, + field: String, + meta_items: &Vec, +) -> FieldValidation { let mut value = None; let (message, code) = extract_message_and_code(&validator_name, &field, meta_items); @@ -206,21 +219,24 @@ pub fn extract_one_arg_validation(val_name: &str, validator_name: String, field: val_name, validator_name, field ), }; - }, + } v => panic!( "Unknown argument `{}` for validator `{}` on field `{}`", v, validator_name, field - ) + ), } - }, - _ => panic!("unexpected item {:?} while parsing `range` validator", item) + } + _ => panic!("unexpected item {:?} while parsing `range` validator", item), }, - _=> unreachable!() + _ => unreachable!(), } } if value.is_none() { - panic!("Missing argument `{}` for validator `{}` on field `{}`", val_name, validator_name, field); + panic!( + "Missing argument `{}` for validator `{}` on field `{}`", + val_name, validator_name, field + ); } let validator = match validator_name.as_ref() { @@ -238,12 +254,21 @@ pub fn extract_one_arg_validation(val_name: &str, validator_name: String, field: } } -fn extract_message_and_code(validator_name: &str, field: &str, meta_items: &Vec) -> (Option, Option) { +fn extract_message_and_code( + validator_name: &str, + field: &str, + meta_items: &Vec, +) -> (Option, Option) { let mut message = None; let mut code = None; for meta_item in meta_items { - if let syn::NestedMeta::Meta(syn::Meta::NameValue(syn::MetaNameValue { ref ident , ref lit, .. })) = *meta_item { + if let syn::NestedMeta::Meta(syn::Meta::NameValue(syn::MetaNameValue { + ref ident, + ref lit, + .. + })) = *meta_item + { match ident.to_string().as_ref() { "code" => { code = match lit_to_string(lit) { @@ -253,7 +278,7 @@ fn extract_message_and_code(validator_name: &str, field: &str, meta_items: &Vec< validator_name, field ), }; - }, + } "message" => { message = match lit_to_string(lit) { Some(s) => Some(s), @@ -262,8 +287,8 @@ fn extract_message_and_code(validator_name: &str, field: &str, meta_items: &Vec< validator_name, field ), }; - }, - _ => continue + } + _ => continue, } } } -- cgit v1.2.3