pros_derive/
lib.rs

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}