1use proc_macro::{self, TokenStream};
2use quote::quote;
3
4#[proc_macro_attribute]
5pub fn auto(_attr: TokenStream, item: TokenStream) -> TokenStream {
6 let function = syn::parse(item).unwrap();
7 let ident = syn::Ident::new("autonomous", proc_macro::Span::call_site().into());
8
9 extern_c_wrapper(function, ident)
10}
11
12#[proc_macro_attribute]
13pub fn init(_attr: TokenStream, item: TokenStream) -> TokenStream {
14 let function = syn::parse(item).unwrap();
15 let ident = syn::Ident::new("initialize", proc_macro::Span::call_site().into());
16
17 extern_c_wrapper(function, ident)
18}
19
20#[proc_macro_attribute]
21pub fn disabled(_attr: TokenStream, item: TokenStream) -> TokenStream {
22 let function = syn::parse(item).unwrap();
23 let ident = syn::Ident::new("disabled", proc_macro::Span::call_site().into());
24
25 extern_c_wrapper(function, ident)
26}
27
28#[proc_macro_attribute]
29pub fn comp_init(_attr: TokenStream, item: TokenStream) -> TokenStream {
30 let function = syn::parse(item).unwrap();
31 let ident = syn::Ident::new(
32 "competition_initialize",
33 proc_macro::Span::call_site().into(),
34 );
35
36 extern_c_wrapper(function, ident)
37}
38
39#[proc_macro_attribute]
40pub fn opcontrol(_attr: TokenStream, item: TokenStream) -> TokenStream {
41 let function = syn::parse(item).unwrap();
42 let ident = syn::Ident::new("opcontrol", proc_macro::Span::call_site().into());
43
44 extern_c_wrapper(function, ident)
45}
46
47fn extern_c_wrapper(function: syn::ItemFn, ident: syn::Ident) -> TokenStream {
48 let block = function.block;
49 let gen: TokenStream = quote! {
50 #[no_mangle]
51 pub extern "C" fn #ident () #block
52 }
53 .into();
54
55 gen
56}