Compare commits
No commits in common. "b3bf6dcac1a76204585fb81bfe14d850165e9efb" and "5f238c7bc42e4abc2c72fb1f93e623934487ff99" have entirely different histories.
b3bf6dcac1
...
5f238c7bc4
@ -5,74 +5,7 @@ use quote::{quote, quote_spanned};
|
|||||||
use syn::{spanned::Spanned, DeriveInput};
|
use syn::{spanned::Spanned, DeriveInput};
|
||||||
|
|
||||||
#[proc_macro_derive(PushPopParse)]
|
#[proc_macro_derive(PushPopParse)]
|
||||||
pub fn poppable_derive_macro(item: TokenStream) -> TokenStream {
|
pub fn pushpop_derive_macro(item: TokenStream) -> TokenStream {
|
||||||
let mut pop_from_ne = pop_ne_derive_macro(item.clone());
|
|
||||||
let pop_from_le = pop_le_derive_macro(item.clone());
|
|
||||||
let pop_from_be = pop_be_derive_macro(item);
|
|
||||||
|
|
||||||
pop_from_ne.extend([pop_from_le, pop_from_be]);
|
|
||||||
pop_from_ne
|
|
||||||
}
|
|
||||||
|
|
||||||
macro_rules! pop_derive_macro {
|
|
||||||
(
|
|
||||||
$fn_name:ident,
|
|
||||||
$trait_name:ident,
|
|
||||||
$trait_pop_fn:ident,
|
|
||||||
$trait_push_fn:ident
|
|
||||||
) => {
|
|
||||||
#[proc_macro_derive($trait_name)]
|
|
||||||
pub fn $fn_name(item: TokenStream) -> TokenStream {
|
|
||||||
let ast: DeriveInput = syn::parse(item).unwrap();
|
|
||||||
let struct_ident = ast.ident;
|
|
||||||
let struct_data: syn::DataStruct = match ast.data {
|
|
||||||
syn::Data::Struct(struct_data) => struct_data,
|
|
||||||
syn::Data::Enum(_) => panic!("Error: Enum support not implemented"),
|
|
||||||
syn::Data::Union(_) => panic!("Error: Union support not implemented"),
|
|
||||||
};
|
|
||||||
|
|
||||||
let recursive = struct_data.fields.iter().map(|f| {
|
|
||||||
let name = &f.ident;
|
|
||||||
let ty = &f.ty;
|
|
||||||
quote_spanned!(f.span()=> let #name = <#ty>::$trait_pop_fn(&mut source)?;)
|
|
||||||
});
|
|
||||||
|
|
||||||
let names = struct_data.fields.iter().map(|f| {
|
|
||||||
let name = &f.ident;
|
|
||||||
quote_spanned!(f.span()=> #name)
|
|
||||||
});
|
|
||||||
let pop = struct_data.fields.iter().map(|f| {
|
|
||||||
let name = &f.ident;
|
|
||||||
quote_spanned!(f.span()=> $trait_name::$trait_push_fn(&self.#name, dest)?;)
|
|
||||||
});
|
|
||||||
|
|
||||||
quote!(
|
|
||||||
impl $trait_name for #struct_ident {
|
|
||||||
fn $trait_pop_fn(mut source: &mut &[u8]) -> anyhow::Result<Self>
|
|
||||||
where
|
|
||||||
Self: Sized,
|
|
||||||
{
|
|
||||||
#(#recursive)*
|
|
||||||
Ok(#struct_ident{
|
|
||||||
#(#names),*
|
|
||||||
})
|
|
||||||
}
|
|
||||||
fn $trait_push_fn<T: Pushable>(&self, dest: &mut T) -> anyhow::Result<()> {
|
|
||||||
#(#pop)*
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.into()
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
pop_derive_macro!(pop_ne_derive_macro, PopFromNE, pop_ne_from, push_ne_into);
|
|
||||||
pop_derive_macro!(pop_le_derive_macro, PopFromLE, pop_le_from, push_le_into);
|
|
||||||
pop_derive_macro!(pop_be_derive_macro, PopFromBE, pop_be_from, push_be_into);
|
|
||||||
/*
|
|
||||||
#[proc_macro_derive(PopFromNE)]
|
|
||||||
pub fn pop_ne_derive_macro(item: TokenStream) -> TokenStream {
|
|
||||||
let ast: DeriveInput = syn::parse(item).unwrap();
|
let ast: DeriveInput = syn::parse(item).unwrap();
|
||||||
let struct_ident = ast.ident;
|
let struct_ident = ast.ident;
|
||||||
let struct_data: syn::DataStruct = match ast.data {
|
let struct_data: syn::DataStruct = match ast.data {
|
||||||
@ -84,7 +17,7 @@ pub fn pop_ne_derive_macro(item: TokenStream) -> TokenStream {
|
|||||||
let recursive = struct_data.fields.iter().map(|f| {
|
let recursive = struct_data.fields.iter().map(|f| {
|
||||||
let name = &f.ident;
|
let name = &f.ident;
|
||||||
let ty = &f.ty;
|
let ty = &f.ty;
|
||||||
quote_spanned!(f.span()=> let #name = <#ty>::pop_ne_from(&mut source)?;)
|
quote_spanned!(f.span()=> let #name = #ty::pop_ne_from(&mut source)?;)
|
||||||
});
|
});
|
||||||
|
|
||||||
let names = struct_data.fields.iter().map(|f| {
|
let names = struct_data.fields.iter().map(|f| {
|
||||||
@ -98,7 +31,7 @@ pub fn pop_ne_derive_macro(item: TokenStream) -> TokenStream {
|
|||||||
|
|
||||||
quote!(
|
quote!(
|
||||||
impl PopFromNE for #struct_ident {
|
impl PopFromNE for #struct_ident {
|
||||||
fn pop_ne_from(mut source: &mut &[u8]) -> anyhow::Result<Self>
|
fn pop_ne_from(mut source: &mut &[u8]) -> Result<Self>
|
||||||
where
|
where
|
||||||
Self: Sized,
|
Self: Sized,
|
||||||
{
|
{
|
||||||
@ -107,10 +40,10 @@ pub fn pop_ne_derive_macro(item: TokenStream) -> TokenStream {
|
|||||||
#(#names),*
|
#(#names),*
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
fn push_ne_into<T: Pushable>(&self, dest: &mut T) -> anyhow::Result<()> {
|
fn push_ne_into<T: Pushable>(&self, dest: &mut T) -> Result<()> {
|
||||||
#(#pop)*
|
#(#pop)*
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.into()
|
.into()
|
||||||
}*/
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user