1#[macro_use]
2mod macros;
3
4use syn::parse::Parser;
5use syn::{Attribute, Meta};
6
7#[test]
8fn test_meta_item_word() {
9 let meta = test("#[foo]");
10
11 snapshot!(meta, @r###"
12 Path(Path {
13 segments: [
14 PathSegment {
15 ident: "foo",
16 arguments: None,
17 },
18 ],
19 })
20 "###);
21}
22
23#[test]
24fn test_meta_item_name_value() {
25 let meta = test("#[foo = 5]");
26
27 snapshot!(meta, @r###"
28 Meta::NameValue {
29 path: Path {
30 segments: [
31 PathSegment {
32 ident: "foo",
33 arguments: None,
34 },
35 ],
36 },
37 lit: 5,
38 }
39 "###);
40}
41
42#[test]
43fn test_meta_item_bool_value() {
44 let meta = test("#[foo = true]");
45
46 snapshot!(meta, @r###"
47 Meta::NameValue {
48 path: Path {
49 segments: [
50 PathSegment {
51 ident: "foo",
52 arguments: None,
53 },
54 ],
55 },
56 lit: Lit::Bool {
57 value: true,
58 },
59 }
60 "###);
61
62 let meta = test("#[foo = false]");
63
64 snapshot!(meta, @r###"
65 Meta::NameValue {
66 path: Path {
67 segments: [
68 PathSegment {
69 ident: "foo",
70 arguments: None,
71 },
72 ],
73 },
74 lit: Lit::Bool {
75 value: false,
76 },
77 }
78 "###);
79}
80
81#[test]
82fn test_meta_item_list_lit() {
83 let meta = test("#[foo(5)]");
84
85 snapshot!(meta, @r###"
86 Meta::List {
87 path: Path {
88 segments: [
89 PathSegment {
90 ident: "foo",
91 arguments: None,
92 },
93 ],
94 },
95 nested: [
96 Lit(5),
97 ],
98 }
99 "###);
100}
101
102#[test]
103fn test_meta_item_list_word() {
104 let meta = test("#[foo(bar)]");
105
106 snapshot!(meta, @r###"
107 Meta::List {
108 path: Path {
109 segments: [
110 PathSegment {
111 ident: "foo",
112 arguments: None,
113 },
114 ],
115 },
116 nested: [
117 Meta(Path(Path {
118 segments: [
119 PathSegment {
120 ident: "bar",
121 arguments: None,
122 },
123 ],
124 })),
125 ],
126 }
127 "###);
128}
129
130#[test]
131fn test_meta_item_list_name_value() {
132 let meta = test("#[foo(bar = 5)]");
133
134 snapshot!(meta, @r###"
135 Meta::List {
136 path: Path {
137 segments: [
138 PathSegment {
139 ident: "foo",
140 arguments: None,
141 },
142 ],
143 },
144 nested: [
145 Meta(Meta::NameValue {
146 path: Path {
147 segments: [
148 PathSegment {
149 ident: "bar",
150 arguments: None,
151 },
152 ],
153 },
154 lit: 5,
155 }),
156 ],
157 }
158 "###);
159}
160
161#[test]
162fn test_meta_item_list_bool_value() {
163 let meta = test("#[foo(bar = true)]");
164
165 snapshot!(meta, @r###"
166 Meta::List {
167 path: Path {
168 segments: [
169 PathSegment {
170 ident: "foo",
171 arguments: None,
172 },
173 ],
174 },
175 nested: [
176 Meta(Meta::NameValue {
177 path: Path {
178 segments: [
179 PathSegment {
180 ident: "bar",
181 arguments: None,
182 },
183 ],
184 },
185 lit: Lit::Bool {
186 value: true,
187 },
188 }),
189 ],
190 }
191 "###);
192}
193
194#[test]
195fn test_meta_item_multiple() {
196 let meta = test("#[foo(word, name = 5, list(name2 = 6), word2)]");
197
198 snapshot!(meta, @r###"
199 Meta::List {
200 path: Path {
201 segments: [
202 PathSegment {
203 ident: "foo",
204 arguments: None,
205 },
206 ],
207 },
208 nested: [
209 Meta(Path(Path {
210 segments: [
211 PathSegment {
212 ident: "word",
213 arguments: None,
214 },
215 ],
216 })),
217 Meta(Meta::NameValue {
218 path: Path {
219 segments: [
220 PathSegment {
221 ident: "name",
222 arguments: None,
223 },
224 ],
225 },
226 lit: 5,
227 }),
228 Meta(Meta::List {
229 path: Path {
230 segments: [
231 PathSegment {
232 ident: "list",
233 arguments: None,
234 },
235 ],
236 },
237 nested: [
238 Meta(Meta::NameValue {
239 path: Path {
240 segments: [
241 PathSegment {
242 ident: "name2",
243 arguments: None,
244 },
245 ],
246 },
247 lit: 6,
248 }),
249 ],
250 }),
251 Meta(Path(Path {
252 segments: [
253 PathSegment {
254 ident: "word2",
255 arguments: None,
256 },
257 ],
258 })),
259 ],
260 }
261 "###);
262}
263
264#[test]
265fn test_bool_lit() {
266 let meta = test("#[foo(true)]");
267
268 snapshot!(meta, @r###"
269 Meta::List {
270 path: Path {
271 segments: [
272 PathSegment {
273 ident: "foo",
274 arguments: None,
275 },
276 ],
277 },
278 nested: [
279 Lit(Lit::Bool {
280 value: true,
281 }),
282 ],
283 }
284 "###);
285}
286
287#[test]
288fn test_negative_lit() {
289 let meta = test("#[form(min = -1, max = 200)]");
290
291 snapshot!(meta, @r###"
292 Meta::List {
293 path: Path {
294 segments: [
295 PathSegment {
296 ident: "form",
297 arguments: None,
298 },
299 ],
300 },
301 nested: [
302 Meta(Meta::NameValue {
303 path: Path {
304 segments: [
305 PathSegment {
306 ident: "min",
307 arguments: None,
308 },
309 ],
310 },
311 lit: -1,
312 }),
313 Meta(Meta::NameValue {
314 path: Path {
315 segments: [
316 PathSegment {
317 ident: "max",
318 arguments: None,
319 },
320 ],
321 },
322 lit: 200,
323 }),
324 ],
325 }
326 "###);
327}
328
329fn test(input: &str) -> Meta {
330 let attrs = Attribute::parse_outer.parse_str(input).unwrap();
331
332 assert_eq!(attrs.len(), 1);
333 let attr = attrs.into_iter().next().unwrap();
334
335 attr.parse_meta().unwrap()
336}
337