1use proc_macro::TokenStream;
2use quote::quote;
3use syn::ItemFn;
4
5#[proc_macro_attribute]
6pub fn decoder(_args: TokenStream, item: TokenStream) -> TokenStream {
7 let mut input = syn::parse_macro_input!(item as ItemFn);
8 let attrs = &input.attrs;
9 let sig = &mut input.sig;
10 let vis = &input.vis;
11 let body = &input.block;
12
13 (quote! {
14 #(#attrs)*
15 #vis #sig {
16 if buf.remaining() < Self::MIN_SIZE {
17 return Err(DecodeError::InvalidSize {
18 expected: Self::MIN_SIZE,
19 received: buf.remaining(),
20 });
21 } else {
22 #body
23 }
24 }
25 })
26 .into()
27}