aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-07-24 23:33:20 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-07-24 23:33:20 +0200
commitf48dcb256e7dca9c6cc4555615033e5ef46d19cf (patch)
tree266e1778e4b115830e785df83b18aa6add8facac
parenta2e7920df8925b2e45437109cd1f4899f70f3e02 (diff)
support length offsets
allows for high level ppp sub-protocols to be implemented
-rw-r--r--src/lib.rs20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 35f2ad7..850ad83 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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()) {