diff options
Diffstat (limited to 'validator_derive/src')
| -rw-r--r-- | validator_derive/src/lib.rs | 9 | ||||
| -rw-r--r-- | validator_derive/src/quoting.rs | 24 | ||||
| -rw-r--r-- | validator_derive/src/validation.rs | 4 |
3 files changed, 34 insertions, 3 deletions
diff --git a/validator_derive/src/lib.rs b/validator_derive/src/lib.rs index f3796b4..d8bbb3e 100644 --- a/validator_derive/src/lib.rs +++ b/validator_derive/src/lib.rs @@ -266,7 +266,7 @@ fn find_validators_for_field( for meta_item in meta_items { match *meta_item { syn::NestedMeta::Meta(ref item) => match *item { - // email, url, phone + // email, url, phone, credit_card, non_control_character syn::Meta::Word(ref name) => match name.to_string().as_ref() { "email" => { assert_string_type("email", field_type); @@ -286,6 +286,11 @@ fn find_validators_for_field( assert_string_type("credit_card", field_type); validators.push(FieldValidation::new(Validator::CreditCard)); } + #[cfg(feature = "unic")] + "non_control_character" => { + assert_string_type("non_control_character", field_type); + validators.push(FieldValidation::new(Validator::NonControlCharacter)); + } _ => panic!("Unexpected validator: {}", name), }, // custom, contains, must_match, regex @@ -341,7 +346,7 @@ fn find_validators_for_field( &meta_items, )); } - "email" | "url" | "phone" | "credit_card" => { + "email" | "url" | "phone" | "credit_card" | "non_control_character" => { validators.push(extract_argless_validation( ident.to_string(), rust_ident.clone(), diff --git a/validator_derive/src/quoting.rs b/validator_derive/src/quoting.rs index b94962c..6bfef0c 100644 --- a/validator_derive/src/quoting.rs +++ b/validator_derive/src/quoting.rs @@ -258,6 +258,26 @@ pub fn quote_phone_validation( field_quoter.wrap_if_option(quoted) } +#[cfg(feature = "unic")] +pub fn quote_non_control_character_validation( + field_quoter: &FieldQuoter, + validation: &FieldValidation, +) -> proc_macro2::TokenStream { + let field_name = &field_quoter.name; + let validator_param = field_quoter.quote_validator_param(); + + let quoted_error = quote_error(&validation); + let quoted = quote!( + if !::validator::validate_non_control_character(#validator_param) { + #quoted_error + err.add_param(::std::borrow::Cow::from("value"), &#validator_param); + errors.add(#field_name, err); + } + ); + + field_quoter.wrap_if_option(quoted) +} + pub fn quote_url_validation( field_quoter: &FieldQuoter, validation: &FieldValidation, @@ -440,6 +460,10 @@ pub fn quote_field_validation( #[cfg(feature = "phone")] Validator::Phone => validations.push(quote_phone_validation(&field_quoter, validation)), Validator::Nested => nested_validations.push(quote_nested_validation(&field_quoter)), + #[cfg(feature = "unic")] + Validator::NonControlCharacter => { + validations.push(quote_non_control_character_validation(&field_quoter, validation)) + } } } diff --git a/validator_derive/src/validation.rs b/validator_derive/src/validation.rs index 5f42d7b..be8afee 100644 --- a/validator_derive/src/validation.rs +++ b/validator_derive/src/validation.rs @@ -146,7 +146,7 @@ pub fn extract_range_validation( } } -/// Extract url/email/phone field validation with a code or a message +/// Extract url/email/phone/non_control_character field validation with a code or a message pub fn extract_argless_validation( validator_name: String, field: String, @@ -178,6 +178,8 @@ pub fn extract_argless_validation( "credit_card" => Validator::CreditCard, #[cfg(feature = "phone")] "phone" => Validator::Phone, + #[cfg(feature = "unic")] + "non_control_character" => Validator::NonControlCharacter, _ => Validator::Url, }; |
