firmware_controller/
lib.rs

1#![doc = include_str!("../README.md")]
2
3use proc_macro::TokenStream;
4use syn::{parse_macro_input, punctuated::Punctuated, ItemImpl, ItemStruct, Meta, Token};
5
6mod controller;
7mod util;
8
9/// See the crate-level documentation for more information.
10#[proc_macro_attribute]
11pub fn controller(attr: TokenStream, item: TokenStream) -> TokenStream {
12    let _args = parse_macro_input!(attr with Punctuated<Meta, Token![,]>::parse_terminated);
13
14    if let Ok(input) = syn::parse::<ItemStruct>(item.clone()) {
15        controller::item_struct::expand(input)
16            .unwrap_or_else(|e| e.to_compile_error())
17            .into()
18    } else if let Ok(input) = syn::parse::<ItemImpl>(item) {
19        controller::item_impl::expand(input)
20            .unwrap_or_else(|e| e.to_compile_error())
21            .into()
22    } else {
23        panic!("Expected struct or trait")
24    }
25}