warpshell_derive/
lib.rs

1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::{self, DeriveInput};
6
7#[proc_macro_derive(GetCtrlChannel)]
8pub fn derive_get_ctrl_channel(input: TokenStream) -> TokenStream {
9    let ast = syn::parse(input).unwrap();
10    impl_get_ctrl_channel(&ast)
11}
12
13#[proc_macro_derive(GetDmaChannel)]
14pub fn derive_get_dma_channel(input: TokenStream) -> TokenStream {
15    let ast = syn::parse(input).unwrap();
16    impl_get_dma_channel(&ast)
17}
18
19fn impl_get_ctrl_channel(ast: &DeriveInput) -> TokenStream {
20    let ty = &ast.ident;
21    let generics = &ast.generics;
22    let tokens = quote! {
23        impl #generics GetCtrlChannel for #ty #generics {
24            fn get_ctrl_channel(&self) -> &CtrlChannel {
25                self.ctrl_channel
26            }
27        }
28    };
29    tokens.into()
30}
31
32fn impl_get_dma_channel(ast: &DeriveInput) -> TokenStream {
33    let ty = &ast.ident;
34    let generics = &ast.generics;
35    let tokens = quote! {
36        impl #generics GetDmaChannel for #ty #generics {
37            fn get_dma_channel(&self) -> &DmaChannel {
38                self.dma_channel
39            }
40        }
41    };
42    tokens.into()
43}