11use proc_macro2:: TokenStream ;
22use quote:: { format_ident, quote} ;
3- use syn:: { Ident , Result , meta:: ParseNestedMeta } ;
3+ use syn:: { Ident , LitBool , LitInt , Result , meta:: ParseNestedMeta } ;
44
55use crate :: validation:: Validation ;
66
7- #[ derive( Default ) ]
8- pub struct Email { }
7+ pub struct Email {
8+ allow_display_text : bool ,
9+ allow_domain_literal : bool ,
10+ minimum_sub_domains : usize ,
11+ }
12+
13+ impl Default for Email {
14+ fn default ( ) -> Self {
15+ Self {
16+ allow_display_text : false ,
17+ allow_domain_literal : true ,
18+ minimum_sub_domains : 0 ,
19+ }
20+ }
21+ }
922
1023impl Validation for Email {
11- fn parse ( _meta : & ParseNestedMeta < ' _ > ) -> Result < Self > {
12- Ok ( Email :: default ( ) )
24+ fn parse ( meta : & ParseNestedMeta < ' _ > ) -> Result < Self > {
25+ let mut result = Email :: default ( ) ;
26+
27+ if !meta. input . is_empty ( ) {
28+ meta. parse_nested_meta ( |meta| {
29+ if meta. path . is_ident ( "allow_display_text" ) {
30+ let lit: LitBool = meta. value ( ) ?. parse ( ) ?;
31+ result. allow_display_text = lit. value ;
32+
33+ Ok ( ( ) )
34+ } else if meta. path . is_ident ( "allow_domain_literal" ) {
35+ let lit: LitBool = meta. value ( ) ?. parse ( ) ?;
36+ result. allow_domain_literal = lit. value ;
37+
38+ Ok ( ( ) )
39+ } else if meta. path . is_ident ( "minimum_sub_domains" ) {
40+ let lit: LitInt = meta. value ( ) ?. parse ( ) ?;
41+ result. minimum_sub_domains = lit. base10_parse ( ) ?;
42+
43+ Ok ( ( ) )
44+ } else {
45+ Err ( meta. error ( "unknown parameter" ) )
46+ }
47+ } ) ?;
48+ }
49+
50+ Ok ( result)
1351 }
1452
1553 fn is_async ( & self ) -> bool {
@@ -25,8 +63,20 @@ impl Validation for Email {
2563 }
2664
2765 fn tokens ( & self , expr : & TokenStream ) -> TokenStream {
66+ let allow_display_text = self . allow_display_text ;
67+ let allow_domain_literal = self . allow_domain_literal ;
68+ let minimum_sub_domains = self . minimum_sub_domains ;
69+
2870 quote ! {
29- #expr. validate_email( )
71+ {
72+ const EMAIL_ADDRESS_OPTIONS : EmailOptions = EmailOptions {
73+ allow_display_text: #allow_display_text,
74+ allow_domain_literal: #allow_domain_literal,
75+ minimum_sub_domains: #minimum_sub_domains,
76+ } ;
77+
78+ #expr. validate_email( EMAIL_ADDRESS_OPTIONS )
79+ }
3080 }
3181 }
3282}
0 commit comments