update rust edition of androscalpel_serializer_derive

This commit is contained in:
Jean-Marie Mineau 2025-04-18 11:07:04 +02:00
parent 4fa4043b97
commit f5a3015e1f
Signed by: histausse
GPG key ID: B66AEEDA9B645AD2
2 changed files with 61 additions and 44 deletions

View file

@ -1,7 +1,7 @@
[package] [package]
name = "androscalpel_serializer_derive" name = "androscalpel_serializer_derive"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2024"
[lib] [lib]
proc-macro = true proc-macro = true

View file

@ -3,8 +3,8 @@ use quote::{format_ident, quote, quote_spanned};
use syn::parse::{Parse, ParseStream}; use syn::parse::{Parse, ParseStream};
use syn::spanned::Spanned; use syn::spanned::Spanned;
use syn::{ use syn::{
parse_macro_input, Attribute, Data, DeriveInput, Field, Fields, Ident, Index, Meta, MetaList, Attribute, Data, DeriveInput, Field, Fields, Ident, Index, Meta, MetaList, Token, Type,
Token, Type, Variant, Variant, parse_macro_input,
}; };
/// Derive the type Serializable. /// Derive the type Serializable.
@ -318,19 +318,25 @@ fn get_enum_match(variant: &Variant) -> TokenStream {
/// for a specific field `f` accessible using `field_ref`. /// for a specific field `f` accessible using `field_ref`.
fn get_implem_size_for_field(f: &Field, field_ref: TokenStream) -> TokenStream { fn get_implem_size_for_field(f: &Field, field_ref: TokenStream) -> TokenStream {
let params = ParamsField::parse(&f.attrs); let params = ParamsField::parse(&f.attrs);
let prefix_stream = if let Some(PrefixParamsField(ref stream)) = params.prefix { let prefix_stream = match params.prefix {
quote_spanned! { f.span() => Some(PrefixParamsField(ref stream)) => {
#stream.iter().collect::<Vec<_>>().len() quote_spanned! { f.span() =>
#stream.iter().collect::<Vec<_>>().len()
}
}
_ => {
quote_spanned! { f.span() => 0 }
} }
} else {
quote_spanned! { f.span() => 0 }
}; };
let suffix_stream = if let Some(SuffixParamsField(ref stream)) = params.suffix { let suffix_stream = match params.suffix {
quote_spanned! { f.span() => Some(SuffixParamsField(ref stream)) => {
#stream.iter().collect::<Vec<_>>().len() quote_spanned! { f.span() =>
#stream.iter().collect::<Vec<_>>().len()
}
}
_ => {
quote_spanned! { f.span() => 0 }
} }
} else {
quote_spanned! { f.span() => 0 }
}; };
let main_stream = match (&f.ty, params) { let main_stream = match (&f.ty, params) {
( (
@ -436,23 +442,29 @@ fn get_implem_size(data: &Data, params: &ParamsStruct) -> TokenStream {
fn get_implem_serialize_for_field(f: &Field, field_ref: TokenStream) -> TokenStream { fn get_implem_serialize_for_field(f: &Field, field_ref: TokenStream) -> TokenStream {
let params = ParamsField::parse(&f.attrs); let params = ParamsField::parse(&f.attrs);
// TODO: Improve error handling // TODO: Improve error handling
let prefix_stream = if let Some(PrefixParamsField(ref stream)) = params.prefix { let prefix_stream = match params.prefix {
quote_spanned! { f.span() => Some(PrefixParamsField(ref stream)) => {
for byte in #stream { quote_spanned! { f.span() =>
<u8 as androscalpel_serializer::Serializable>::serialize(&byte, output)?; for byte in #stream {
<u8 as androscalpel_serializer::Serializable>::serialize(&byte, output)?;
}
} }
} }
} else { _ => {
quote_spanned! { f.span() => } quote_spanned! { f.span() => }
}
}; };
let suffix_stream = if let Some(SuffixParamsField(ref stream)) = params.suffix { let suffix_stream = match params.suffix {
quote_spanned! { f.span() => Some(SuffixParamsField(ref stream)) => {
for byte in #stream { quote_spanned! { f.span() =>
<u8 as androscalpel_serializer::Serializable>::serialize(&byte, output)?; for byte in #stream {
<u8 as androscalpel_serializer::Serializable>::serialize(&byte, output)?;
}
} }
} }
} else { _ => {
quote_spanned! { f.span() => } quote_spanned! { f.span() => }
}
}; };
let main_stream = match (&f.ty, params) { let main_stream = match (&f.ty, params) {
( (
@ -538,7 +550,6 @@ fn get_implem_serialize(data: &Data, params: &ParamsStruct) -> TokenStream {
"The first field of a named field variant must be named `prefix` and of the type of the prefix of the enum" "The first field of a named field variant must be named `prefix` and of the type of the prefix of the enum"
); );
} }
let recurse = fields.named.iter().map(|f| { let recurse = fields.named.iter().map(|f| {
let name = &f.ident; let name = &f.ident;
get_implem_serialize_for_field(f, quote! { *#name }) get_implem_serialize_for_field(f, quote! { *#name })
@ -587,31 +598,37 @@ fn get_implem_deserialize_for_field(f: &Field, field_ref: TokenStream) -> TokenS
let params = ParamsField::parse(&f.attrs); let params = ParamsField::parse(&f.attrs);
let ty = &f.ty; let ty = &f.ty;
// TODO: Improve error handling // TODO: Improve error handling
let prefix_stream = if let Some(PrefixParamsField(ref stream)) = params.prefix { let prefix_stream = match params.prefix {
quote_spanned! { f.span() => Some(PrefixParamsField(ref stream)) => {
for byte in #stream { quote_spanned! { f.span() =>
if <u8 as androscalpel_serializer::Serializable>::deserialize(input)? != byte { for byte in #stream {
return Err(androscalpel_serializer::Error::DeserializationError( if <u8 as androscalpel_serializer::Serializable>::deserialize(input)? != byte {
"Prefix do not match #stream".into() return Err(androscalpel_serializer::Error::DeserializationError(
)); "Prefix do not match #stream".into()
));
}
} }
} }
} }
} else { _ => {
quote_spanned! { f.span() => } quote_spanned! { f.span() => }
}
}; };
let suffix_stream = if let Some(SuffixParamsField(ref stream)) = params.suffix { let suffix_stream = match params.suffix {
quote_spanned! { f.span() => Some(SuffixParamsField(ref stream)) => {
for byte in #stream { quote_spanned! { f.span() =>
if <u8 as androscalpel_serializer::Serializable>::deserialize(input)? != byte { for byte in #stream {
return Err(androscalpel_serializer::Error::DeserializationError( if <u8 as androscalpel_serializer::Serializable>::deserialize(input)? != byte {
"Suffix do not match #stream".into() return Err(androscalpel_serializer::Error::DeserializationError(
)); "Suffix do not match #stream".into()
));
}
} }
} }
} }
} else { _ => {
quote_spanned! { f.span() => } quote_spanned! { f.span() => }
}
}; };
match (ty, params) { match (ty, params) {
( (