@@ -16,31 +16,103 @@ pub struct Input {
16
16
pub fields : Vec < Field > ,
17
17
/// The struct overall visibility
18
18
pub visibility : Visibility ,
19
+ /// Additional attributes requested with `#[soa_attr(...)]`
20
+ pub attrs : ExtraAttributes ,
21
+ }
19
22
20
- pub vec_attrs : Vec < Meta > ,
21
- pub slice_attrs : Vec < Meta > ,
22
- pub slice_mut_attrs : Vec < Meta > ,
23
- pub ref_attrs : Vec < Meta > ,
24
- pub ref_mut_attrs : Vec < Meta > ,
25
- pub ptr_attrs : Vec < Meta > ,
26
- pub ptr_mut_attrs : Vec < Meta > ,
23
+ pub struct ExtraAttributes {
24
+ pub vec : Vec < Meta > ,
25
+ pub slice : Vec < Meta > ,
26
+ pub slice_mut : Vec < Meta > ,
27
+ pub ref_ : Vec < Meta > ,
28
+ pub ref_mut : Vec < Meta > ,
29
+ pub ptr : Vec < Meta > ,
30
+ pub ptr_mut : Vec < Meta > ,
31
+ }
32
+
33
+ impl ExtraAttributes {
34
+ fn new ( ) -> ExtraAttributes {
35
+ ExtraAttributes {
36
+ vec : Vec :: new ( ) ,
37
+ slice : Vec :: new ( ) ,
38
+ slice_mut : Vec :: new ( ) ,
39
+ ref_ : Vec :: new ( ) ,
40
+ ref_mut : Vec :: new ( ) ,
41
+ ptr : Vec :: new ( ) ,
42
+ ptr_mut : Vec :: new ( ) ,
43
+ }
44
+ }
45
+
46
+ /// parse a single `#[soa_attr(...)]`
47
+ fn parse ( & mut self , meta : & Meta ) {
48
+ match meta {
49
+ Meta :: List ( MetaList { nested, .. } ) => {
50
+ let [ soa_type, attr] : [ NestedMeta ; 2 ] = nested. into_iter ( )
51
+ . cloned ( )
52
+ . collect :: < Vec < _ > > ( )
53
+ . try_into ( )
54
+ . unwrap_or_else ( |_| panic ! (
55
+ "expected #[soa_attr(\" Types, To, Add, Attribute\" , \
56
+ \" Attribute\" )], got #[{}]", quote!( #meta)
57
+ ) ) ;
58
+
59
+ let attr = match attr {
60
+ NestedMeta :: Meta ( meta) => meta,
61
+ NestedMeta :: Lit ( _) => {
62
+ panic ! ( "expected an attribute, got {}" , quote!( attr) )
63
+ }
64
+ } ;
65
+
66
+ match soa_type {
67
+ NestedMeta :: Meta ( Meta :: Path ( path) ) => match path. get_ident ( ) {
68
+ Some ( ident) => match ident. to_string ( ) . as_str ( ) {
69
+ "Vec" => {
70
+ self . vec . push ( attr) ;
71
+ } ,
72
+ "Slice" => {
73
+ self . slice . push ( attr) ;
74
+ } ,
75
+ "SliceMut" => {
76
+ self . slice_mut . push ( attr) ;
77
+ } ,
78
+ "Ref" => {
79
+ self . ref_ . push ( attr) ;
80
+ } ,
81
+ "RefMut" => {
82
+ self . ref_mut . push ( attr) ;
83
+ } ,
84
+ "Ptr" => {
85
+ self . ptr . push ( attr) ;
86
+ } ,
87
+ "PtrMut" => {
88
+ self . ptr_mut . push ( attr) ;
89
+ } ,
90
+ _ => panic ! ( "expected a soa type, got {}" , ident) ,
91
+ } ,
92
+ None => {
93
+ panic ! ( "expected a soa type, got {}" , quote!( #path) ) ;
94
+ }
95
+ } ,
96
+ _ => {
97
+ panic ! ( "expected a soa type, got {}" , quote!( #soa_type) ) ;
98
+ }
99
+ } ;
100
+ }
101
+ _ => panic ! ( "expected #[soa_attr(...)], got #[{}]" , quote!( #meta) ) ,
102
+ }
103
+ }
27
104
}
28
105
29
106
impl Input {
30
107
pub fn new ( input : DeriveInput ) -> Input {
31
108
let fields = match input. data {
32
109
Data :: Struct ( s) => s. fields . iter ( ) . cloned ( ) . collect :: < Vec < _ > > ( ) ,
33
- _ => panic ! ( "#[derive(StructOfArray)] only supports structs. " ) ,
110
+ _ => panic ! ( "#[derive(StructOfArray)] only supports struct " ) ,
34
111
} ;
35
112
36
113
let mut derives: Vec < Ident > = vec ! [ ] ;
37
- let mut vec_attrs = Vec :: new ( ) ;
38
- let mut slice_attrs = Vec :: new ( ) ;
39
- let mut slice_mut_attrs = Vec :: new ( ) ;
40
- let mut ref_attrs = Vec :: new ( ) ;
41
- let mut ref_mut_attrs = Vec :: new ( ) ;
42
- let mut ptr_attrs = Vec :: new ( ) ;
43
- let mut ptr_mut_attrs = Vec :: new ( ) ;
114
+ let mut extra_attrs = ExtraAttributes :: new ( ) ;
115
+
44
116
for attr in input. attrs {
45
117
if let Ok ( meta) = attr. parse_meta ( ) {
46
118
if meta. path ( ) . is_ident ( "soa_derive" ) {
@@ -59,40 +131,7 @@ impl Input {
59
131
) ,
60
132
}
61
133
} else if meta. path ( ) . is_ident ( "soa_attr" ) {
62
- match meta. clone ( ) {
63
- Meta :: List ( MetaList { nested, .. } ) => {
64
- let [ soa_type, attr] : [ NestedMeta ; 2 ] =
65
- nested. into_iter ( ) . collect :: < Vec < _ > > ( ) . try_into ( ) . unwrap_or_else ( |_| panic ! ( "expected #[soa_attr(\" Types, To, Add, Attribute\" , \" Attribute\" )], got #[{}]" , quote!( #meta) ) ) ;
66
- let attr = match attr {
67
- NestedMeta :: Meta ( meta) => meta,
68
- NestedMeta :: Lit ( _) => {
69
- panic ! ( "expected a attribute, got {}" , quote!( attr) )
70
- }
71
- } ;
72
- let attrs_mut = match soa_type {
73
- NestedMeta :: Meta ( Meta :: Path ( path) ) => match path. get_ident ( ) {
74
- Some ( ident) => match ident. to_string ( ) . as_str ( ) {
75
- "Vec" => & mut vec_attrs,
76
- "Slice" => & mut slice_attrs,
77
- "SliceMut" => & mut slice_mut_attrs,
78
- "Ref" => & mut ref_attrs,
79
- "RefMut" => & mut ref_mut_attrs,
80
- "Ptr" => & mut ptr_attrs,
81
- "PtrMut" => & mut ptr_mut_attrs,
82
- _ => panic ! ( "expected a soa type, got {}" , ident) ,
83
- } ,
84
- None => {
85
- panic ! ( "expected a soa type, got {}" , quote!( #path) ) ;
86
- }
87
- } ,
88
- _ => {
89
- panic ! ( "expected a soa type, got {}" , quote!( #soa_type) ) ;
90
- }
91
- } ;
92
- attrs_mut. push ( attr) ;
93
- }
94
- _ => panic ! ( "expected #[soa_attr(...)], got #[{}]" , quote!( #meta) ) ,
95
- }
134
+ extra_attrs. parse ( & meta) ;
96
135
}
97
136
}
98
137
}
@@ -102,13 +141,7 @@ impl Input {
102
141
derives : derives,
103
142
fields : fields,
104
143
visibility : input. vis ,
105
- vec_attrs,
106
- slice_attrs,
107
- slice_mut_attrs,
108
- ref_attrs,
109
- ref_mut_attrs,
110
- ptr_attrs,
111
- ptr_mut_attrs,
144
+ attrs : extra_attrs,
112
145
}
113
146
}
114
147
0 commit comments