ant_derive/
lib.rs

1// Copyright 2023 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
6// option. This file may not be copied, modified, or distributed
7// except according to those terms.
8
9extern crate proc_macro;
10
11use proc_macro::TokenStream;
12use quote::quote;
13
14#[proc_macro_derive(AntTx)]
15pub fn derive_ant_tx(input: TokenStream) -> TokenStream {
16    let ast = syn::parse(input).unwrap();
17
18    impl_ant_tx(&ast)
19}
20
21fn impl_ant_tx(ast: &syn::DeriveInput) -> TokenStream {
22    let name = &ast.ident;
23    let gen = quote! {
24        impl AntTxMessageType for #name {
25            fn serialize_message(&self, buf: &mut [u8]) -> Result<usize, PackingError> {
26                let len = PackedStructSlice::packed_bytes_size(Some(self))?;
27                self.pack_to_slice(&mut buf[..len])?;
28                Ok(len)
29            }
30            fn get_tx_msg_id(&self) -> TxMessageId {
31                TxMessageId::#name
32            }
33        }
34    };
35    gen.into()
36}
37
38#[proc_macro_derive(DataPage)]
39pub fn derive_data_page(input: TokenStream) -> TokenStream {
40    let ast = syn::parse(input).unwrap();
41
42    impl_data_page(&ast)
43}
44
45fn impl_data_page(ast: &syn::DeriveInput) -> TokenStream {
46    let name = &ast.ident;
47    let gen = quote! {
48        impl #name {
49            fn get_datapage_number(&self) -> u8 {
50                self.data_page_number.into()
51            }
52        }
53    };
54    gen.into()
55}