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