Skip to content

Commit 7c15022

Browse files
committed
Small refactor of attributes handling
1 parent daab3b2 commit 7c15022

File tree

5 files changed

+96
-63
lines changed

5 files changed

+96
-63
lines changed

soa-derive-internal/src/input.rs

Lines changed: 89 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -16,31 +16,103 @@ pub struct Input {
1616
pub fields: Vec<Field>,
1717
/// The struct overall visibility
1818
pub visibility: Visibility,
19+
/// Additional attributes requested with `#[soa_attr(...)]`
20+
pub attrs: ExtraAttributes,
21+
}
1922

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+
}
27104
}
28105

29106
impl Input {
30107
pub fn new(input: DeriveInput) -> Input {
31108
let fields = match input.data {
32109
Data::Struct(s) => s.fields.iter().cloned().collect::<Vec<_>>(),
33-
_ => panic!("#[derive(StructOfArray)] only supports structs."),
110+
_ => panic!("#[derive(StructOfArray)] only supports struct"),
34111
};
35112

36113
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+
44116
for attr in input.attrs {
45117
if let Ok(meta) = attr.parse_meta() {
46118
if meta.path().is_ident("soa_derive") {
@@ -59,40 +131,7 @@ impl Input {
59131
),
60132
}
61133
} 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);
96135
}
97136
}
98137
}
@@ -102,13 +141,7 @@ impl Input {
102141
derives: derives,
103142
fields: fields,
104143
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,
112145
}
113146
}
114147

soa-derive-internal/src/ptr.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ pub fn derive(input: &Input) -> TokenStream {
77
let name = &input.name;
88
let visibility = &input.visibility;
99
let other_derive = &input.derive_with_exceptions();
10-
let attrs = &input.ptr_attrs;
11-
let mut_attrs = &input.ptr_mut_attrs;
10+
let attrs = &input.attrs.ptr;
11+
let mut_attrs = &input.attrs.ptr_mut;
1212
let vec_name = &input.vec_name();
1313
let ptr_name = &input.ptr_name();
1414
let ptr_mut_name = &input.ptr_mut_name();

soa-derive-internal/src/refs.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ pub fn derive(input: &Input) -> TokenStream {
77
let name = &input.name;
88
let visibility = &input.visibility;
99
let other_derive = &input.derive_with_exceptions();
10-
let attrs = &input.ref_attrs;
11-
let mut_attrs = &input.ref_mut_attrs;
10+
let attrs = &input.attrs.ref_;
11+
let mut_attrs = &input.attrs.ref_mut;
1212
let vec_name = &input.vec_name();
1313
let ref_name = &input.ref_name();
1414
let ref_mut_name = &input.ref_mut_name();

soa-derive-internal/src/slice.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ pub fn derive(input: &Input) -> TokenStream {
99
let other_derive = &input.derive_with_exceptions();
1010
let visibility = &input.visibility;
1111
let slice_name = &input.slice_name();
12-
let attrs = &input.slice_attrs;
12+
let attrs = &input.attrs.slice;
1313
let vec_name = &input.vec_name();
1414
let ref_name = &input.ref_name();
1515
let ptr_name = &input.ptr_name();
@@ -241,7 +241,7 @@ pub fn derive_mut(input: &Input) -> TokenStream {
241241
let slice_name = &input.slice_name();
242242
let slice_mut_name = &input.slice_mut_name();
243243
let vec_name = &input.vec_name();
244-
let attrs = &input.slice_mut_attrs;
244+
let attrs = &input.attrs.slice_mut;
245245
let ref_mut_name = &input.ref_mut_name();
246246
let ptr_name = &input.ptr_name();
247247
let ptr_mut_name = &input.ptr_mut_name();

soa-derive-internal/src/vec.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ pub fn derive(input: &Input) -> TokenStream {
99
let name = &input.name;
1010
let vec_name_str = format!("Vec<{}>", name);
1111
let other_derive = &input.derive();
12-
let attrs = &input.vec_attrs;
12+
let attrs = &input.attrs.vec;
1313
let visibility = &input.visibility;
1414
let vec_name = &input.vec_name();
1515
let slice_name = &input.slice_name();

0 commit comments

Comments
 (0)