Skip to main content

cu_bincode_derive/
lib.rs

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