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}