1use crate::utils::get_fl_name;
2use proc_macro::TokenStream;
3use quote::*;
4use syn::*;
5
6pub fn impl_button_trait(ast: &DeriveInput) -> TokenStream {
7 let name = &ast.ident;
8
9 let name_str = get_fl_name(name.to_string());
10
11 let shortcut = Ident::new(format!("{}_{}", name_str, "shortcut").as_str(), name.span());
12 let set_shortcut = Ident::new(
13 format!("{}_{}", name_str, "set_shortcut").as_str(),
14 name.span(),
15 );
16 let clear = Ident::new(format!("{}_{}", name_str, "clear").as_str(), name.span());
17 let value = Ident::new(format!("{}_{}", name_str, "value").as_str(), name.span());
18 let set_value = Ident::new(
19 format!("{}_{}", name_str, "set_value").as_str(),
20 name.span(),
21 );
22 let down_box = Ident::new(format!("{}_{}", name_str, "down_box").as_str(), name.span());
23 let set_down_box = Ident::new(
24 format!("{}_{}", name_str, "set_down_box").as_str(),
25 name.span(),
26 );
27
28 let gen = quote! {
29 unsafe impl ButtonExt for #name {
30 fn shortcut(&self) -> Shortcut {
31 unsafe {
32 assert!(!self.was_deleted());
33 mem::transmute(#shortcut(self.inner))
34 }
35 }
36
37 fn set_shortcut(&mut self, shortcut: Shortcut) {
38 unsafe {
39 assert!(!self.was_deleted());
40 #set_shortcut(self.inner, shortcut.bits() as i32)
41 }
42 }
43
44 fn clear(&mut self) {
45 unsafe {
46 assert!(!self.was_deleted());
47 #clear(self.inner);
48 }
49 }
50
51 fn is_set(&self) -> bool {
52 unsafe {
53 assert!(!self.was_deleted());
54 #value(self.inner) != 0
55 }
56 }
57
58 fn set(&mut self, flag: bool) {
59 unsafe {
60 assert!(!self.was_deleted());
61 #set_value(self.inner, flag as i32)
62 }
63 }
64
65 fn value(&self) -> bool {
66 unsafe {
67 assert!(!self.was_deleted());
68 #value(self.inner) != 0
69 }
70 }
71
72 fn set_value(&mut self, flag: bool) {
73 unsafe {
74 assert!(!self.was_deleted());
75 #set_value(self.inner, flag as i32)
76 }
77 }
78
79 fn set_down_frame(&mut self, f: FrameType) {
80 assert!(!self.was_deleted());
81 unsafe {
82 #set_down_box(self.inner, f as i32)
83 }
84 }
85
86 fn down_frame(&self) -> FrameType {
87 assert!(!self.was_deleted());
88 unsafe {
89 mem::transmute(#down_box(self.inner))
90 }
91 }
92 }
93 };
94 gen.into()
95}