106 lines
3.1 KiB
Rust
106 lines
3.1 KiB
Rust
mod attribute;
|
|
mod derive_enum;
|
|
mod derive_struct;
|
|
|
|
use attribute::ContainerAttributes;
|
|
use virtue::prelude::*;
|
|
|
|
#[proc_macro_derive(Encode, attributes(bincode))]
|
|
pub fn derive_encode(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
|
derive_encode_inner(input).unwrap_or_else(|e| e.into_token_stream())
|
|
}
|
|
|
|
fn derive_encode_inner(input: TokenStream) -> Result<TokenStream> {
|
|
let parse = Parse::new(input)?;
|
|
let (mut generator, attributes, body) = parse.into_generator();
|
|
let attributes = attributes
|
|
.get_attribute::<ContainerAttributes>()?
|
|
.unwrap_or_default();
|
|
|
|
match body {
|
|
Body::Struct(body) => {
|
|
derive_struct::DeriveStruct {
|
|
fields: body.fields,
|
|
attributes,
|
|
}
|
|
.generate_encode(&mut generator)?;
|
|
}
|
|
Body::Enum(body) => {
|
|
derive_enum::DeriveEnum {
|
|
variants: body.variants,
|
|
attributes,
|
|
}
|
|
.generate_encode(&mut generator)?;
|
|
}
|
|
}
|
|
|
|
generator.export_to_file("Encode");
|
|
generator.finish()
|
|
}
|
|
|
|
#[proc_macro_derive(Decode, attributes(bincode))]
|
|
pub fn derive_decode(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
|
derive_decode_inner(input).unwrap_or_else(|e| e.into_token_stream())
|
|
}
|
|
|
|
fn derive_decode_inner(input: TokenStream) -> Result<TokenStream> {
|
|
let parse = Parse::new(input)?;
|
|
let (mut generator, attributes, body) = parse.into_generator();
|
|
let attributes = attributes
|
|
.get_attribute::<ContainerAttributes>()?
|
|
.unwrap_or_default();
|
|
|
|
match body {
|
|
Body::Struct(body) => {
|
|
derive_struct::DeriveStruct {
|
|
fields: body.fields,
|
|
attributes,
|
|
}
|
|
.generate_decode(&mut generator)?;
|
|
}
|
|
Body::Enum(body) => {
|
|
derive_enum::DeriveEnum {
|
|
variants: body.variants,
|
|
attributes,
|
|
}
|
|
.generate_decode(&mut generator)?;
|
|
}
|
|
}
|
|
|
|
generator.export_to_file("Decode");
|
|
generator.finish()
|
|
}
|
|
|
|
#[proc_macro_derive(BorrowDecode, attributes(bincode))]
|
|
pub fn derive_borrow_decode(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
|
|
derive_borrow_decode_inner(input).unwrap_or_else(|e| e.into_token_stream())
|
|
}
|
|
|
|
fn derive_borrow_decode_inner(input: TokenStream) -> Result<TokenStream> {
|
|
let parse = Parse::new(input)?;
|
|
let (mut generator, attributes, body) = parse.into_generator();
|
|
let attributes = attributes
|
|
.get_attribute::<ContainerAttributes>()?
|
|
.unwrap_or_default();
|
|
|
|
match body {
|
|
Body::Struct(body) => {
|
|
derive_struct::DeriveStruct {
|
|
fields: body.fields,
|
|
attributes,
|
|
}
|
|
.generate_borrow_decode(&mut generator)?;
|
|
}
|
|
Body::Enum(body) => {
|
|
derive_enum::DeriveEnum {
|
|
variants: body.variants,
|
|
attributes,
|
|
}
|
|
.generate_borrow_decode(&mut generator)?;
|
|
}
|
|
}
|
|
|
|
generator.export_to_file("BorrowDecode");
|
|
generator.finish()
|
|
}
|