Skip to main content

cu_bincode_derive/
lib.rs

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