From 48a179d2ccfbda0e6f501337ac4bd18f953858be Mon Sep 17 00:00:00 2001 From: ShadoySV Date: Wed, 20 May 2020 15:33:12 +0300 Subject: required validation --- validator_derive/src/lib.rs | 3 +++ validator_derive/src/quoting.rs | 23 +++++++++++++++++++++++ validator_derive/tests/required.rs | 31 +++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 validator_derive/tests/required.rs (limited to 'validator_derive') diff --git a/validator_derive/src/lib.rs b/validator_derive/src/lib.rs index 6f74202..6f91ae8 100644 --- a/validator_derive/src/lib.rs +++ b/validator_derive/src/lib.rs @@ -287,6 +287,9 @@ fn find_validators_for_field( Validator::NonControlCharacter, )); } + "required" => { + validators.push(FieldValidation::new(Validator::Required)); + } _ => panic!("Unexpected validator: {:?}", name.get_ident()), } } diff --git a/validator_derive/src/quoting.rs b/validator_derive/src/quoting.rs index dc466ac..4c81037 100644 --- a/validator_derive/src/quoting.rs +++ b/validator_derive/src/quoting.rs @@ -465,6 +465,9 @@ pub fn quote_field_validation( Validator::NonControlCharacter => { validations.push(quote_non_control_character_validation(&field_quoter, validation)) } + Validator::Required => { + validations.push(quote_required_validation(&field_quoter, validation)) + } } } @@ -501,3 +504,23 @@ pub fn quote_schema_validation(validation: Option) -> proc_mac quote!() } } + +pub fn quote_required_validation( + field_quoter: &FieldQuoter, + validation: &FieldValidation, +) -> proc_macro2::TokenStream { + let field_name = &field_quoter.name; + let ident = &field_quoter.ident; + let validator_param = quote!(&self.#ident); + + let quoted_error = quote_error(&validation); + let quoted = quote!( + if !::validator::validate_required(#validator_param) { + #quoted_error + err.add_param(::std::borrow::Cow::from("value"), &#validator_param); + errors.add(#field_name, err); + } + ); + + quoted +} diff --git a/validator_derive/tests/required.rs b/validator_derive/tests/required.rs new file mode 100644 index 0000000..2f02b1b --- /dev/null +++ b/validator_derive/tests/required.rs @@ -0,0 +1,31 @@ +#[macro_use] +extern crate validator_derive; + +use serde::Serialize; +use validator::Validate; + +#[derive(Debug, Serialize)] +struct ObjectRef { + id: i32, + name: String, +} + +#[derive(Debug, Validate)] +struct TestStruct { + #[validate(required)] + val: Option, +} + +#[test] +fn can_validate_some() { + let s = TestStruct { val: Some(ObjectRef { id: 0, name: String::new() }) }; + + assert!(s.validate().is_ok()); +} + +#[test] +fn none_fails_validate() { + let s = TestStruct { val: None }; + + assert!(s.validate().is_err()); +} -- cgit v1.2.3 From b83aba922a3d21091b036dcac2840e4ae62e9ebc Mon Sep 17 00:00:00 2001 From: ShadoySV Date: Thu, 28 May 2020 13:39:31 +0300 Subject: required_nested implementation --- validator_derive/src/lib.rs | 4 ++++ validator_derive/src/quoting.rs | 2 +- validator_derive/tests/required.rs | 44 ++++++++++++++++++++++++++++++++------ 3 files changed, 42 insertions(+), 8 deletions(-) (limited to 'validator_derive') diff --git a/validator_derive/src/lib.rs b/validator_derive/src/lib.rs index 6f91ae8..3244679 100644 --- a/validator_derive/src/lib.rs +++ b/validator_derive/src/lib.rs @@ -290,6 +290,10 @@ fn find_validators_for_field( "required" => { validators.push(FieldValidation::new(Validator::Required)); } + "required_nested" => { + validators.push(FieldValidation::new(Validator::Required)); + validators.push(FieldValidation::new(Validator::Nested)); + } _ => panic!("Unexpected validator: {:?}", name.get_ident()), } } diff --git a/validator_derive/src/quoting.rs b/validator_derive/src/quoting.rs index 4c81037..a5af288 100644 --- a/validator_derive/src/quoting.rs +++ b/validator_derive/src/quoting.rs @@ -465,7 +465,7 @@ pub fn quote_field_validation( Validator::NonControlCharacter => { validations.push(quote_non_control_character_validation(&field_quoter, validation)) } - Validator::Required => { + Validator::Required | Validator::RequiredNested => { validations.push(quote_required_validation(&field_quoter, validation)) } } diff --git a/validator_derive/tests/required.rs b/validator_derive/tests/required.rs index 2f02b1b..a073f28 100644 --- a/validator_derive/tests/required.rs +++ b/validator_derive/tests/required.rs @@ -4,28 +4,58 @@ extern crate validator_derive; use serde::Serialize; use validator::Validate; -#[derive(Debug, Serialize)] +#[derive(Serialize)] struct ObjectRef { id: i32, name: String, } -#[derive(Debug, Validate)] -struct TestStruct { +#[derive(Serialize, Validate)] +struct CheckedObjectRef { + #[validate(range(min = 1))] + id: i32, + #[validate(length(min = 1))] + name: String, +} + +#[derive(Validate)] +struct Required { #[validate(required)] val: Option, } +#[derive(Validate)] +struct RequiredNested { + #[validate(required_nested)] + val: Option, +} + +#[test] +fn can_validate_required() { + let s = Required { val: Some(ObjectRef { id: 0, name: String::new() }) }; + + assert!(s.validate().is_ok()); +} + #[test] -fn can_validate_some() { - let s = TestStruct { val: Some(ObjectRef { id: 0, name: String::new() }) }; +fn can_validate_required_nested() { + let s = RequiredNested { + val: Some(CheckedObjectRef { id: 1, name: String::from("Reference representation") }), + }; assert!(s.validate().is_ok()); } #[test] -fn none_fails_validate() { - let s = TestStruct { val: None }; +fn none_fails_required() { + let s = Required { val: None }; + + assert!(s.validate().is_err()); +} + +#[test] +fn none_fails_required_nested() { + let s = RequiredNested { val: None }; assert!(s.validate().is_err()); } -- cgit v1.2.3