update rust edition of androscalpel_serializer_derive
This commit is contained in:
parent
4fa4043b97
commit
f5a3015e1f
2 changed files with 61 additions and 44 deletions
|
|
@ -1,7 +1,7 @@
|
|||
[package]
|
||||
name = "androscalpel_serializer_derive"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
edition = "2024"
|
||||
|
||||
[lib]
|
||||
proc-macro = true
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ use quote::{format_ident, quote, quote_spanned};
|
|||
use syn::parse::{Parse, ParseStream};
|
||||
use syn::spanned::Spanned;
|
||||
use syn::{
|
||||
parse_macro_input, Attribute, Data, DeriveInput, Field, Fields, Ident, Index, Meta, MetaList,
|
||||
Token, Type, Variant,
|
||||
Attribute, Data, DeriveInput, Field, Fields, Ident, Index, Meta, MetaList, Token, Type,
|
||||
Variant, parse_macro_input,
|
||||
};
|
||||
|
||||
/// Derive the type Serializable.
|
||||
|
|
@ -318,19 +318,25 @@ fn get_enum_match(variant: &Variant) -> TokenStream {
|
|||
/// for a specific field `f` accessible using `field_ref`.
|
||||
fn get_implem_size_for_field(f: &Field, field_ref: TokenStream) -> TokenStream {
|
||||
let params = ParamsField::parse(&f.attrs);
|
||||
let prefix_stream = if let Some(PrefixParamsField(ref stream)) = params.prefix {
|
||||
let prefix_stream = match params.prefix {
|
||||
Some(PrefixParamsField(ref stream)) => {
|
||||
quote_spanned! { f.span() =>
|
||||
#stream.iter().collect::<Vec<_>>().len()
|
||||
}
|
||||
} else {
|
||||
}
|
||||
_ => {
|
||||
quote_spanned! { f.span() => 0 }
|
||||
}
|
||||
};
|
||||
let suffix_stream = if let Some(SuffixParamsField(ref stream)) = params.suffix {
|
||||
let suffix_stream = match params.suffix {
|
||||
Some(SuffixParamsField(ref stream)) => {
|
||||
quote_spanned! { f.span() =>
|
||||
#stream.iter().collect::<Vec<_>>().len()
|
||||
}
|
||||
} else {
|
||||
}
|
||||
_ => {
|
||||
quote_spanned! { f.span() => 0 }
|
||||
}
|
||||
};
|
||||
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 {
|
||||
let params = ParamsField::parse(&f.attrs);
|
||||
// TODO: Improve error handling
|
||||
let prefix_stream = if let Some(PrefixParamsField(ref stream)) = params.prefix {
|
||||
let prefix_stream = match params.prefix {
|
||||
Some(PrefixParamsField(ref stream)) => {
|
||||
quote_spanned! { f.span() =>
|
||||
for byte in #stream {
|
||||
<u8 as androscalpel_serializer::Serializable>::serialize(&byte, output)?;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
}
|
||||
_ => {
|
||||
quote_spanned! { f.span() => }
|
||||
}
|
||||
};
|
||||
let suffix_stream = if let Some(SuffixParamsField(ref stream)) = params.suffix {
|
||||
let suffix_stream = match params.suffix {
|
||||
Some(SuffixParamsField(ref stream)) => {
|
||||
quote_spanned! { f.span() =>
|
||||
for byte in #stream {
|
||||
<u8 as androscalpel_serializer::Serializable>::serialize(&byte, output)?;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
}
|
||||
_ => {
|
||||
quote_spanned! { f.span() => }
|
||||
}
|
||||
};
|
||||
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"
|
||||
);
|
||||
}
|
||||
|
||||
let recurse = fields.named.iter().map(|f| {
|
||||
let name = &f.ident;
|
||||
get_implem_serialize_for_field(f, quote! { *#name })
|
||||
|
|
@ -587,7 +598,8 @@ fn get_implem_deserialize_for_field(f: &Field, field_ref: TokenStream) -> TokenS
|
|||
let params = ParamsField::parse(&f.attrs);
|
||||
let ty = &f.ty;
|
||||
// TODO: Improve error handling
|
||||
let prefix_stream = if let Some(PrefixParamsField(ref stream)) = params.prefix {
|
||||
let prefix_stream = match params.prefix {
|
||||
Some(PrefixParamsField(ref stream)) => {
|
||||
quote_spanned! { f.span() =>
|
||||
for byte in #stream {
|
||||
if <u8 as androscalpel_serializer::Serializable>::deserialize(input)? != byte {
|
||||
|
|
@ -597,10 +609,13 @@ fn get_implem_deserialize_for_field(f: &Field, field_ref: TokenStream) -> TokenS
|
|||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
}
|
||||
_ => {
|
||||
quote_spanned! { f.span() => }
|
||||
}
|
||||
};
|
||||
let suffix_stream = if let Some(SuffixParamsField(ref stream)) = params.suffix {
|
||||
let suffix_stream = match params.suffix {
|
||||
Some(SuffixParamsField(ref stream)) => {
|
||||
quote_spanned! { f.span() =>
|
||||
for byte in #stream {
|
||||
if <u8 as androscalpel_serializer::Serializable>::deserialize(input)? != byte {
|
||||
|
|
@ -610,8 +625,10 @@ fn get_implem_deserialize_for_field(f: &Field, field_ref: TokenStream) -> TokenS
|
|||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
}
|
||||
_ => {
|
||||
quote_spanned! { f.span() => }
|
||||
}
|
||||
};
|
||||
match (ty, params) {
|
||||
(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue