@@ -26,12 +26,17 @@ pub struct BytesRules {
2626impl ToValidationTokens for BytesRules {
2727 fn to_validation_tokens ( & self , ctx : & Context , name : & Ident ) -> TokenStream {
2828 let rules = prost_validate_types:: BytesRules :: from ( self . to_owned ( ) ) ;
29+ let maybe_return = if ctx. multierrs {
30+ quote ! { errs. push }
31+ } else {
32+ quote ! { return Err }
33+ } ;
2934 let r#const = rules. r#const . map ( |v| {
3035 let v = LitByteStr :: new ( v. as_slice ( ) , Span :: call_site ( ) ) ;
3136 let field = & ctx. name ;
3237 quote ! {
3338 if !#name. iter( ) . eq( #v. iter( ) ) {
34- return Err ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Const ( #v. to_vec( ) ) ) ) ;
39+ #maybe_return ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Const ( #v. to_vec( ) ) ) ) ;
3540 }
3641 }
3742 } ) ;
@@ -40,7 +45,7 @@ impl ToValidationTokens for BytesRules {
4045 let field = & ctx. name ;
4146 quote ! {
4247 if #name. len( ) != #v {
43- return Err ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Len ( #v) ) ) ;
48+ #maybe_return ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Len ( #v) ) ) ;
4449 }
4550 }
4651 } ) ;
@@ -49,7 +54,7 @@ impl ToValidationTokens for BytesRules {
4954 let field = & ctx. name ;
5055 quote ! {
5156 if #name. len( ) < #v {
52- return Err ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: MinLen ( #v) ) ) ;
57+ #maybe_return ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: MinLen ( #v) ) ) ;
5358 }
5459 }
5560 } ) ;
@@ -58,7 +63,7 @@ impl ToValidationTokens for BytesRules {
5863 let field = & ctx. name ;
5964 quote ! {
6065 if #name. len( ) > #v {
61- return Err ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: MaxLen ( #v) ) ) ;
66+ #maybe_return ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: MaxLen ( #v) ) ) ;
6267 }
6368 }
6469 } ) ;
@@ -68,11 +73,13 @@ impl ToValidationTokens for BytesRules {
6873 panic ! ( "{field}: Invalid regex pattern: {}" , err) ;
6974 }
7075 quote ! {
71- let regex = :: regex:: bytes:: Regex :: new( #v) . map_err( |err| {
72- :: prost_validate:: Error :: new( #field, format!( "Invalid regex pattern: {}" , err) )
73- } ) ?;
74- if !regex. is_match( #name. iter( ) . as_slice( ) ) {
75- return Err ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Pattern ( #v. to_string( ) ) ) ) ;
76+ match :: regex:: bytes:: Regex :: new( #v) {
77+ Err ( e) => #maybe_return( :: prost_validate:: Error :: new( #field, format!( "Invalid regex pattern: {e}" ) ) ) ,
78+ Ok ( regex) => {
79+ if !regex. is_match( #name. as_slice( ) ) {
80+ #maybe_return( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Pattern ( #v. to_string( ) ) ) ) ;
81+ }
82+ }
7683 }
7784 }
7885 } ) ;
@@ -81,7 +88,7 @@ impl ToValidationTokens for BytesRules {
8188 let field = & ctx. name ;
8289 quote ! {
8390 if !#name. starts_with( #v) {
84- return Err ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Prefix ( #v. to_vec( ) ) ) ) ;
91+ #maybe_return ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Prefix ( #v. to_vec( ) ) ) ) ;
8592 }
8693 }
8794 } ) ;
@@ -90,7 +97,7 @@ impl ToValidationTokens for BytesRules {
9097 let field = & ctx. name ;
9198 quote ! {
9299 if !#name. ends_with( #v) {
93- return Err ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Suffix ( #v. to_vec( ) ) ) ) ;
100+ #maybe_return ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Suffix ( #v. to_vec( ) ) ) ) ;
94101 }
95102 }
96103 } ) ;
@@ -99,7 +106,7 @@ impl ToValidationTokens for BytesRules {
99106 let field = & ctx. name ;
100107 quote ! {
101108 if !:: prost_validate:: ValidateBytesExt :: contains( & #name, #v. as_slice( ) ) {
102- return Err ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Contains ( #v. to_vec( ) ) ) ) ;
109+ #maybe_return ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Contains ( #v. to_vec( ) ) ) ) ;
103110 }
104111 }
105112 } ) ;
@@ -113,7 +120,7 @@ impl ToValidationTokens for BytesRules {
113120 quote ! {
114121 let values = [ #( #v. to_vec( ) ) , * ] ;
115122 if !values. contains( & #name) {
116- return Err ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: In ( values. iter( ) . map( |v| v. to_vec( ) ) . collect( ) ) ) ) ;
123+ #maybe_return ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: In ( values. iter( ) . map( |v| v. to_vec( ) ) . collect( ) ) ) ) ;
117124 }
118125 }
119126 } ) ;
@@ -127,7 +134,7 @@ impl ToValidationTokens for BytesRules {
127134 quote ! {
128135 let values = [ #( #v. to_vec( ) ) , * ] ;
129136 if values. contains( & #name) {
130- return Err ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: NotIn ( values. iter( ) . map( |v| v. to_vec( ) ) . collect( ) ) ) ) ;
137+ #maybe_return ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: NotIn ( values. iter( ) . map( |v| v. to_vec( ) ) . collect( ) ) ) ) ;
131138 }
132139 }
133140 } ) ;
@@ -136,23 +143,23 @@ impl ToValidationTokens for BytesRules {
136143 let field = & ctx. name ;
137144 quote ! {
138145 if #name. len( ) != 4 && #name. len( ) != 16 {
139- return Err ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Ip ) ) ;
146+ #maybe_return ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Ip ) ) ;
140147 }
141148 }
142149 }
143150 bytes_rules:: WellKnown :: Ipv4 ( true ) => {
144151 let field = & ctx. name ;
145152 quote ! {
146153 if #name. len( ) != 4 {
147- return Err ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Ipv4 ) ) ;
154+ #maybe_return ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Ipv4 ) ) ;
148155 }
149156 }
150157 }
151158 bytes_rules:: WellKnown :: Ipv6 ( true ) => {
152159 let field = & ctx. name ;
153160 quote ! {
154161 if #name. len( ) != 16 {
155- return Err ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Ipv6 ) ) ;
162+ #maybe_return ( :: prost_validate:: Error :: new( #field, :: prost_validate:: errors:: bytes:: Error :: Ipv6 ) ) ;
156163 }
157164 }
158165 }
0 commit comments