bincode_derive/
lib.rs

1mod attribute;
2mod derive_enum;
3mod derive_struct;
4
5use attribute::ContainerAttributes;
6use virtue::prelude::*;
7
8#[proc_macro_derive(Encode, attributes(bincode))]
9pub fn derive_encode(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
10    derive_encode_inner(input).unwrap_or_else(|e| e.into_token_stream())
11}
12
13fn derive_encode_inner(input: TokenStream) -> Result<TokenStream> {
14    let parse = Parse::new(input)?;
15    let (mut generator, attributes, body) = parse.into_generator();
16    let attributes = attributes
17        .get_attribute::<ContainerAttributes>()?
18        .unwrap_or_default();
19
20    match body {
21        Body::Struct(body) => {
22            derive_struct::DeriveStruct {
23                fields: body.fields,
24                attributes,
25            }
26            .generate_encode(&mut generator)?;
27        }
28        Body::Enum(body) => {
29            derive_enum::DeriveEnum {
30                variants: body.variants,
31                attributes,
32            }
33            .generate_encode(&mut generator)?;
34        }
35    }
36
37    generator.export_to_file("bincode", "Encode");
38    generator.finish()
39}
40
41#[proc_macro_derive(Decode, attributes(bincode))]
42pub fn derive_decode(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
43    derive_decode_inner(input).unwrap_or_else(|e| e.into_token_stream())
44}
45
46fn derive_decode_inner(input: TokenStream) -> Result<TokenStream> {
47    let parse = Parse::new(input)?;
48    let (mut generator, attributes, body) = parse.into_generator();
49    let attributes = attributes
50        .get_attribute::<ContainerAttributes>()?
51        .unwrap_or_default();
52
53    match body {
54        Body::Struct(body) => {
55            derive_struct::DeriveStruct {
56                fields: body.fields,
57                attributes,
58            }
59            .generate_decode(&mut generator)?;
60        }
61        Body::Enum(body) => {
62            derive_enum::DeriveEnum {
63                variants: body.variants,
64                attributes,
65            }
66            .generate_decode(&mut generator)?;
67        }
68    }
69
70    generator.export_to_file("bincode", "Decode");
71    generator.finish()
72}
73
74#[proc_macro_derive(BorrowDecode, attributes(bincode))]
75pub fn derive_borrow_decode(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
76    derive_borrow_decode_inner(input).unwrap_or_else(|e| e.into_token_stream())
77}
78
79fn derive_borrow_decode_inner(input: TokenStream) -> Result<TokenStream> {
80    let parse = Parse::new(input)?;
81    let (mut generator, attributes, body) = parse.into_generator();
82    let attributes = attributes
83        .get_attribute::<ContainerAttributes>()?
84        .unwrap_or_default();
85
86    match body {
87        Body::Struct(body) => {
88            derive_struct::DeriveStruct {
89                fields: body.fields,
90                attributes,
91            }
92            .generate_borrow_decode(&mut generator)?;
93        }
94        Body::Enum(body) => {
95            derive_enum::DeriveEnum {
96                variants: body.variants,
97                attributes,
98            }
99            .generate_borrow_decode(&mut generator)?;
100        }
101    }
102
103    generator.export_to_file("bincode", "BorrowDecode");
104    generator.finish()
105}