Add field custom encoder decoder support

This commit is contained in:
vagola
2020-01-03 18:31:44 +03:00
parent 0a0500239b
commit 61fff6fcf7
4 changed files with 104 additions and 15 deletions

View File

@@ -5,6 +5,7 @@ use proc_macro2::Ident;
use proc_macro2::TokenStream as TokenStream2;
use quote::{quote, TokenStreamExt};
use std::iter::FromIterator;
use syn::export::Span;
use syn::{parse_macro_input, Data, DeriveInput, Field, Fields, Lit, Meta, NestedMeta};
#[proc_macro_derive(Packet, attributes(packet))]
@@ -34,10 +35,21 @@ fn impl_encoder_trait(name: &Ident, fields: &Fields) -> TokenStream2 {
let name = &field.ident;
let unparsed_meta = get_packet_field_meta(field);
let parsed_meta = parse_field_meta(&unparsed_meta);
let parsed_meta = parse_packet_field_meta(&unparsed_meta);
quote! {
crate::Encoder::encode(&self.#name, writer)?;
match parsed_meta.module {
Some(module) => {
let module_ident = Ident::new(&module, Span::call_site());
quote! {
crate::#module_ident::encode(&self.#name, writer)?;
}
}
None => {
quote! {
crate::Encoder::encode(&self.#name, writer)?;
}
}
}
});
@@ -76,7 +88,7 @@ struct PacketFieldMeta {
max_length: Option<u16>,
}
fn parse_field_meta(meta_list: &Vec<NestedMeta>) -> PacketFieldMeta {
fn parse_packet_field_meta(meta_list: &Vec<NestedMeta>) -> PacketFieldMeta {
let mut module = None;
let mut max_length = None;