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}