uiautomation_derive/
lib.rs1extern crate proc_macro;
2
3#[cfg(feature = "enum_derive")]
4mod enum_derives;
5#[cfg(feature = "action_derive")]
6mod action_derives;
7#[cfg(feature = "control_derive")]
8mod control_derives;
9#[cfg(feature = "pattern_derive")]
10mod pattern_derivers;
11
12use proc_macro::TokenStream;
13use syn::ItemEnum;
14use syn::Path;
15
16#[cfg(feature = "enum_derive")]
17use self::enum_derives::*;
18#[cfg(feature = "action_derive")]
19use self::action_derives::*;
20#[cfg(feature = "control_derive")]
21use self::control_derives::*;
22#[cfg(feature = "pattern_derive")]
23use self::pattern_derivers::*;
24
25#[cfg(feature = "action_derive")]
26#[proc_macro_derive(Invoke)]
27pub fn derive_invoke(input: TokenStream) -> TokenStream {
28    let ast = syn::parse(input).unwrap();
29
30    impl_invoke(&ast)
31}
32
33#[cfg(feature = "action_derive")]
34#[proc_macro_derive(SelectionItem)]
35pub fn derive_selection_item(input: TokenStream) -> TokenStream {
36    let ast = syn::parse(input).unwrap();
37
38    impl_selection_item(&ast)
39}
40
41#[cfg(feature = "action_derive")]
42#[proc_macro_derive(MultipleView)]
43pub fn derive_multiple_view(input: TokenStream) -> TokenStream {
44    let ast = syn::parse(input).unwrap();
45
46    impl_multiple_view(&ast)
47}
48
49#[cfg(feature = "action_derive")]
50#[proc_macro_derive(ItemContainer)]
51pub fn item_container_derive(input: TokenStream) -> TokenStream {
52    let ast = syn::parse(input).unwrap();
53
54    impl_item_container(&ast)
55}
56
57#[cfg(feature = "action_derive")]
58#[proc_macro_derive(ScrollItem)]
59pub fn derive_scroll_item(input: TokenStream) -> TokenStream {
60    let ast = syn::parse(input).unwrap();
61
62    impl_scroll_item(&ast)    
63}
64
65#[cfg(feature = "action_derive")]
66#[proc_macro_derive(Window)]
67pub fn derive_window(input: TokenStream) -> TokenStream {
68    let ast = syn::parse(input).unwrap();
69
70    impl_window(&ast)
71}
72
73#[cfg(feature = "action_derive")]
74#[proc_macro_derive(Transform)]
75pub fn derive_transform(input: TokenStream) -> TokenStream {
76    let ast = syn::parse(input).unwrap();
77
78    impl_transform(&ast)
79}
80
81#[cfg(feature = "action_derive")]
82#[proc_macro_derive(Value)]
83pub fn derive_value(input: TokenStream) -> TokenStream {
84    let ast = syn::parse(input).unwrap();
85
86    impl_value(&ast)
87}
88
89#[cfg(feature = "action_derive")]
90#[proc_macro_derive(ExpandCollapse)]
91pub fn derive_expand_collapse(input: TokenStream) -> TokenStream {
92    let ast = syn::parse(input).unwrap();
93
94    impl_expand_collapse(&ast)
95}
96
97#[cfg(feature = "action_derive")]
98#[proc_macro_derive(Toggle)]
99pub fn derive_toggle(input: TokenStream) -> TokenStream {
100    let ast = syn::parse(input).unwrap();
101
102    impl_toggle(&ast)
103}
104
105#[cfg(feature = "action_derive")]
106#[proc_macro_derive(Grid)]
107pub fn derive_grid(input: TokenStream) -> TokenStream {
108    let ast = syn::parse(input).unwrap();
109
110    impl_grid(&ast)
111}
112
113#[cfg(feature = "action_derive")]
114#[proc_macro_derive(Table)]
115pub fn derive_table(input: TokenStream) -> TokenStream {
116    let ast = syn::parse(input).unwrap();
117    
118    impl_table(&ast)
119}
120
121#[cfg(feature = "action_derive")]
122#[proc_macro_derive(Scroll)]
123pub fn derive_scroll(input: TokenStream) -> TokenStream {
124    let ast = syn::parse(input).unwrap();
125
126    impl_scroll(&ast)
127}
128
129#[cfg(feature = "action_derive")]
130#[proc_macro_derive(Selection)]
131pub fn derive_selection(input: TokenStream) -> TokenStream {
132    let ast = syn::parse(input).unwrap();
133
134    impl_selection(&ast)
135}
136
137#[cfg(feature = "action_derive")]
138#[proc_macro_derive(CustomNavigation)]
139pub fn derive_custom_navigation(input: TokenStream) -> TokenStream {
140    let ast = syn::parse(input).unwrap();
141
142    impl_custom_navigation(&ast)
143}
144
145#[cfg(feature = "action_derive")]
146#[proc_macro_derive(GridItem)]
147pub fn derive_grid_item(input: TokenStream) -> TokenStream {
148    let ast = syn::parse(input).unwrap();
149
150    impl_grid_item(&ast)
151}
152
153#[cfg(feature = "action_derive")]
154#[proc_macro_derive(TableItem)]
155pub fn derive_table_item(input: TokenStream) -> TokenStream {
156    let ast = syn::parse(input).unwrap();
157
158    impl_table_item(&ast)
159}
160
161#[cfg(feature = "action_derive")]
162#[proc_macro_derive(Text)]
163pub fn derive_text(input: TokenStream) -> TokenStream {
164    let ast = syn::parse(input).unwrap();
165
166    impl_text(&ast)
167}
168
169#[cfg(feature = "action_derive")]
170#[proc_macro_derive(RangeValue)]
171pub fn derive_range_value(input: TokenStream) -> TokenStream {
172    let ast = syn::parse(input).unwrap();
173
174    impl_range_value(&ast)    
175}
176
177#[cfg(feature = "action_derive")]
178#[proc_macro_derive(Dock)]
179pub fn derive_dock(input: TokenStream) -> TokenStream {
180    let ast = syn::parse(input).unwrap();
181
182    impl_dock(&ast)    
183}
184
185#[proc_macro_derive(EnumConvert)]
186pub fn derive_enum_convert(input: TokenStream) -> TokenStream {
187    let enum_item = syn::parse::<ItemEnum>(input).expect("#[Derive(EnumConvert)] must be used on enums only");
188
189    impl_enum_convert(enum_item)
190}
191
192#[cfg(feature = "control_derive")]
193#[proc_macro_derive(Control)]
194pub fn derive_control(input: TokenStream) -> TokenStream {
195    let ast = syn::parse(input).unwrap();
196
197    impl_control(&ast)
198}
199
200#[proc_macro_attribute]
201pub fn map_as(args: TokenStream, item: TokenStream) -> TokenStream {
202    let type_path: Path = syn::parse(args).expect("#[maps_as() requires type path");
203    let enum_item: ItemEnum = syn::parse(item).expect("#[map_as()] must be used on enums only");
204
205    impl_map_as(type_path, enum_item)
206}
207
208#[cfg(feature = "pattern_derive")]
209#[proc_macro_attribute]
210pub fn pattern_as(attr: TokenStream, item: TokenStream) -> TokenStream {
211    use syn::punctuated::Punctuated;
212    use syn::ItemStruct;
213    use syn::Token;
214
215    let struct_item: ItemStruct = syn::parse(item).expect("#[pattern_as()] must be used on struct only");
216
217    let parser = Punctuated::<syn::Path, Token![,]>::parse_terminated;
218    let args = syn::parse_macro_input!(attr with parser);
219    let mut arg_itr = args.into_iter();
230    let type_item = arg_itr.next().expect("#[pattern_as()] requires pattern type");
231    if arg_itr.next().is_some() {
233        return syn::Error::new(
234            proc_macro2::Span::call_site(), 
235            "#[pattern_as()] support only single parameter"
236        ).to_compile_error()
237        .into();
238    }
239
240    impl_pattern_as(struct_item, type_item)
241}