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]
|
[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
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
(
|
(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue