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}