1
1
use crate :: symbol:: {
2
- DEFAULT , NAME , ROOT , SKIP_SERIALIZING , TYPE , VEC_SIZE , WITH_CUSTOM_NS , WITH_NS , XML_SERDE ,
2
+ DEFAULT , DENY_UNKNOWN , NAME , ROOT , SKIP_SERIALIZING , TYPE , VEC_SIZE , WITH_CUSTOM_NS , WITH_NS ,
3
+ XML_SERDE ,
3
4
} ;
4
5
use proc_macro2:: { Group , Span , TokenStream , TokenTree } ;
5
6
use syn:: parse:: { self , Parse } ;
@@ -16,6 +17,7 @@ pub struct Container<'a> {
16
17
pub with_ns : Option < syn:: LitByteStr > ,
17
18
pub custom_ns : Vec < ( syn:: LitByteStr , syn:: LitByteStr ) > ,
18
19
pub root : Option < syn:: LitByteStr > ,
20
+ pub deny_unknown : bool ,
19
21
}
20
22
21
23
impl < ' a > Container < ' a > {
@@ -27,12 +29,16 @@ impl<'a> Container<'a> {
27
29
if self . root . is_some ( ) && self . is_enum ( ) {
28
30
panic ! ( "for clarity, enum should not have the root attribute. please use a struct to wrap the enum and set its type to untag" )
29
31
}
32
+ if self . deny_unknown && self . is_enum ( ) {
33
+ panic ! ( "`deny_unknown_fields` is not supported in enum type" )
34
+ }
30
35
}
31
36
32
37
pub fn from_ast ( item : & ' a syn:: DeriveInput , _derive : Derive ) -> Container < ' a > {
33
38
let mut with_ns = Option :: < syn:: LitByteStr > :: None ;
34
39
let mut custom_ns = Vec :: < ( syn:: LitByteStr , syn:: LitByteStr ) > :: new ( ) ;
35
40
let mut root = Option :: < syn:: LitByteStr > :: None ;
41
+ let mut deny_unknown = false ;
36
42
for meta_item in item
37
43
. attrs
38
44
. iter ( )
@@ -49,6 +55,9 @@ impl<'a> Container<'a> {
49
55
let s = get_lit_byte_str ( & m. value ) . expect ( "parse root failed" ) ;
50
56
root = Some ( s. clone ( ) ) ;
51
57
}
58
+ Meta :: Path ( p) if p == DENY_UNKNOWN => {
59
+ deny_unknown = true ;
60
+ }
52
61
Meta :: List ( l) if l. path == WITH_CUSTOM_NS => {
53
62
let strs = l
54
63
. parse_args_with ( Punctuated :: < syn:: LitByteStr , Comma > :: parse_terminated)
@@ -80,6 +89,7 @@ impl<'a> Container<'a> {
80
89
with_ns,
81
90
custom_ns,
82
91
root,
92
+ deny_unknown,
83
93
}
84
94
}
85
95
syn:: Data :: Enum ( e) => {
@@ -95,6 +105,7 @@ impl<'a> Container<'a> {
95
105
with_ns,
96
106
custom_ns,
97
107
root,
108
+ deny_unknown,
98
109
}
99
110
}
100
111
syn:: Data :: Union ( _) => panic ! ( "Only support struct and enum type, union is found" ) ,
0 commit comments