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}