mod encode_to_expr;
mod size_expr;
use proc_macro2::TokenStream;
use quote::quote;
use syn::{parse_macro_input, parse_quote, DeriveInput};
use self::{encode_to_expr::EncodeToExpr, size_expr::SizeExpr};
use crate::{context::Context, util::add_trait_bounds};
pub fn derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
let mut input = parse_macro_input!(input as DeriveInput);
let name = input.ident;
let generics = add_trait_bounds(input.generics, parse_quote!(Encode));
let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
let context = Context::new(&name, &mut input.data);
let size: TokenStream = context.size_expr();
let encode_to = context.encode_to_expr();
let expanded = quote! {
#[nimble::async_trait]
impl #impl_generics Encode for #name #ty_generics #where_clause {
fn size(&self) -> usize {
#size
}
async fn encode_to<W>(&self, config: &nimble::Config, mut writer: W) -> nimble::Result<usize>
where
W: nimble::io::Write + Unpin + Send,
{
#encode_to
}
}
};
proc_macro::TokenStream::from(expanded)
}