pros_derive 0.1.0

proc macros for pros-rs
Documentation
use proc_macro::{self, TokenStream};
use quote::quote;

#[proc_macro_attribute]
pub fn auto(_attr: TokenStream, item: TokenStream) -> TokenStream {
    let function = syn::parse(item).unwrap();
    let ident = syn::Ident::new("autonomous", proc_macro::Span::call_site().into());

    extern_c_wrapper(function, ident)
}

#[proc_macro_attribute]
pub fn init(_attr: TokenStream, item: TokenStream) -> TokenStream {
    let function = syn::parse(item).unwrap();
    let ident = syn::Ident::new("initialize", proc_macro::Span::call_site().into());

    extern_c_wrapper(function, ident)
}

#[proc_macro_attribute]
pub fn disabled(_attr: TokenStream, item: TokenStream) -> TokenStream {
    let function = syn::parse(item).unwrap();
    let ident = syn::Ident::new("disabled", proc_macro::Span::call_site().into());

    extern_c_wrapper(function, ident)
}

#[proc_macro_attribute]
pub fn comp_init(_attr: TokenStream, item: TokenStream) -> TokenStream {
    let function = syn::parse(item).unwrap();
    let ident = syn::Ident::new(
        "competition_initialize",
        proc_macro::Span::call_site().into(),
    );

    extern_c_wrapper(function, ident)
}

#[proc_macro_attribute]
pub fn opcontrol(_attr: TokenStream, item: TokenStream) -> TokenStream {
    let function = syn::parse(item).unwrap();
    let ident = syn::Ident::new("opcontrol", proc_macro::Span::call_site().into());

    extern_c_wrapper(function, ident)
}

fn extern_c_wrapper(function: syn::ItemFn, ident: syn::Ident) -> TokenStream {
    let block = function.block;
    let gen: TokenStream = quote! {
        #[no_mangle]
        pub extern "C" fn #ident () #block
    }
    .into();

    gen
}