diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-07-24 23:33:20 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-07-24 23:33:20 +0200 |
commit | f48dcb256e7dca9c6cc4555615033e5ef46d19cf (patch) | |
tree | 266e1778e4b115830e785df83b18aa6add8facac | |
parent | a2e7920df8925b2e45437109cd1f4899f70f3e02 (diff) |
support length offsets
allows for high level ppp sub-protocols to be implemented
-rw-r--r-- | src/lib.rs | 20 |
1 files changed, 15 insertions, 5 deletions
@@ -10,8 +10,8 @@ use syn::{parse, ItemStruct}; #[darling(attributes(ppproperly))] #[darling(default)] struct Args { - len_for: Option<String>, discriminant_for: Option<DiscriminantArgs>, + len_for: Option<LenArgs>, } #[derive(Debug, Default, FromMeta)] @@ -20,6 +20,12 @@ struct DiscriminantArgs { data_type: String, } +#[derive(Debug, Default, FromMeta)] +struct LenArgs { + field: String, + offset: isize, +} + #[proc_macro_derive(Serialize, attributes(ppproperly))] pub fn derive_serialize(item: TokenStream) -> TokenStream { let ast: ItemStruct = parse(item).unwrap(); @@ -44,11 +50,12 @@ pub fn derive_serialize(item: TokenStream) -> TokenStream { } if let Some(attr) = args.len_for { - let attr_ident = Ident::new(&attr, Span::call_site()); + let field_ident = Ident::new(&attr.field, Span::call_site()); + let offset = attr.offset; out.extend( vec![quote!( - self.#attr_ident.len().serialize(w)?; + (self.#field_ident.len() + #offset).serialize(w)?; )] .into_iter(), ); @@ -140,17 +147,20 @@ pub fn derive_deserialize(item: TokenStream) -> TokenStream { } if let Some(attr) = args.len_for { + let field = attr.field; + let offset = attr.offset; + out.extend( vec![quote!( let mut len = 0u16; len.deserialize(r)?; - len_for.insert(#attr, len); + len_for.insert(#field, len - #offset); )] .into_iter(), ); - len_for.insert(attr, ()); + len_for.insert(field, ()); } if len_for.contains_key(&field_name.to_string()) { |