aboutsummaryrefslogtreecommitdiffstats
path: root/validator_derive/src
diff options
context:
space:
mode:
Diffstat (limited to 'validator_derive/src')
-rw-r--r--validator_derive/src/lib.rs8
-rw-r--r--validator_derive/src/quoting.rs17
-rw-r--r--validator_derive/src/validation.rs9
3 files changed, 30 insertions, 4 deletions
diff --git a/validator_derive/src/lib.rs b/validator_derive/src/lib.rs
index 1298006..9cfc381 100644
--- a/validator_derive/src/lib.rs
+++ b/validator_derive/src/lib.rs
@@ -256,7 +256,7 @@ fn find_validators_for_field(field: &syn::Field, field_types: &HashMap<String, S
for meta_item in meta_items {
match *meta_item {
syn::NestedMetaItem::MetaItem(ref item) => match *item {
- // email, url
+ // email, url, phone
syn::MetaItem::Word(ref name) => match name.to_string().as_ref() {
"email" => {
assert_string_type("email", field_type);
@@ -266,6 +266,10 @@ fn find_validators_for_field(field: &syn::Field, field_types: &HashMap<String, S
assert_string_type("url", field_type);
validators.push(FieldValidation::new(Validator::Url));
},
+ "phone" => {
+ assert_string_type("phone", field_type);
+ validators.push(FieldValidation::new(Validator::Phone));
+ },
_ => panic!("Unexpected validator: {}", name)
},
// custom, contains, must_match, regex
@@ -311,7 +315,7 @@ fn find_validators_for_field(field: &syn::Field, field_types: &HashMap<String, S
assert_has_range(rust_ident.clone(), field_type);
validators.push(extract_range_validation(rust_ident.clone(), meta_items));
},
- "email" | "url" => {
+ "email" | "url" | "phone" => {
validators.push(extract_argless_validation(name.to_string(), rust_ident.clone(), meta_items));
},
"custom" => {
diff --git a/validator_derive/src/quoting.rs b/validator_derive/src/quoting.rs
index 69353e9..24c50d8 100644
--- a/validator_derive/src/quoting.rs
+++ b/validator_derive/src/quoting.rs
@@ -158,6 +158,22 @@ pub fn quote_range_validation(field_quoter: &FieldQuoter, validation: &FieldVali
unreachable!()
}
+pub fn quote_phone_validation(field_quoter: &FieldQuoter, validation: &FieldValidation) -> quote::Tokens {
+ 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_phone(#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) -> quote::Tokens {
let field_name = &field_quoter.name;
let validator_param = field_quoter.quote_validator_param();
@@ -293,6 +309,7 @@ pub fn quote_field_validation(field_quoter: &FieldQuoter, validation: &FieldVali
Validator::Custom(_) => quote_custom_validation(&field_quoter, validation),
Validator::Contains(_) => quote_contains_validation(&field_quoter, validation),
Validator::Regex(_) => quote_regex_validation(&field_quoter, validation),
+ Validator::Phone => quote_phone_validation(&field_quoter, validation),
}
}
diff --git a/validator_derive/src/validation.rs b/validator_derive/src/validation.rs
index a3350da..259db70 100644
--- a/validator_derive/src/validation.rs
+++ b/validator_derive/src/validation.rs
@@ -173,7 +173,7 @@ pub fn extract_range_validation(field: String, meta_items: &Vec<syn::NestedMetaI
}
}
-/// Extract url/email field validation with a code or a message
+/// 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<syn::NestedMetaItem>) -> FieldValidation {
let mut code = None;
let mut message = None;
@@ -213,7 +213,12 @@ pub fn extract_argless_validation(validator_name: String, field: String, meta_it
}
}
- let validator = if validator_name == "email" { Validator::Email } else { Validator::Url };
+ let validator = match validator_name.as_ref() {
+ "email" => Validator::Email,
+ "phone" => Validator::Phone,
+ _ => Validator::Url
+ };
+
FieldValidation {
message,
code: code.unwrap_or_else(|| validator.code().to_string()),