1 #[macro_use]
2 extern crate darling;
3 #[macro_use]
4 extern crate syn;
5 #[macro_use]
6 extern crate quote;
7
8 use darling::FromDeriveInput;
9
10 #[derive(Debug, Default, PartialEq, Eq, FromMeta)]
11 #[darling(default)]
12 pub struct Amet {
13 hello: bool,
14 world: String,
15 }
16
17 #[derive(Debug, PartialEq, Eq, FromMeta)]
18 #[darling(rename_all = "snake_case")]
19 pub enum Lorem {
20 Ipsum(bool),
21 Dolor(String),
22 Sit(Amet),
23 }
24
25 #[derive(Debug, PartialEq, Eq, FromDeriveInput)]
26 #[darling(attributes(hello))]
27 pub struct Holder {
28 lorem: Lorem,
29 }
30
31 impl PartialEq<Lorem> for Holder {
eq(&self, other: &Lorem) -> bool32 fn eq(&self, other: &Lorem) -> bool {
33 self.lorem == *other
34 }
35 }
36
37 #[test]
bool_word()38 fn bool_word() {
39 let di = parse_quote! {
40 #[hello(lorem(ipsum))]
41 pub struct Bar;
42 };
43
44 let pr = Holder::from_derive_input(&di).unwrap();
45 assert_eq!(pr, Lorem::Ipsum(true));
46 }
47
48 #[test]
bool_literal()49 fn bool_literal() {
50 let di = parse_quote! {
51 #[hello(lorem(ipsum = false))]
52 pub struct Bar;
53 };
54
55 let pr = Holder::from_derive_input(&di).unwrap();
56 assert_eq!(pr, Lorem::Ipsum(false));
57 }
58
59 #[test]
string_literal()60 fn string_literal() {
61 let di = parse_quote! {
62 #[hello(lorem(dolor = "Hello"))]
63 pub struct Bar;
64 };
65
66 let pr = Holder::from_derive_input(&di).unwrap();
67 assert_eq!(pr, Lorem::Dolor("Hello".to_string()));
68 }
69
70 #[test]
struct_nested()71 fn struct_nested() {
72 let di = parse_quote! {
73 #[hello(lorem(sit(world = "Hello", hello = false)))]
74 pub struct Bar;
75 };
76
77 let pr = Holder::from_derive_input(&di).unwrap();
78 assert_eq!(
79 pr,
80 Lorem::Sit(Amet {
81 hello: false,
82 world: "Hello".to_string(),
83 })
84 );
85 }
86
87 #[test]
88 #[should_panic]
format_mismatch()89 fn format_mismatch() {
90 let di = parse_quote! {
91 #[hello(lorem(dolor(world = "Hello", hello = false)))]
92 pub struct Bar;
93 };
94
95 Holder::from_derive_input(&di).unwrap();
96 }
97