1#![no_std]
2
3extern crate alloc;
4extern crate proc_macro;
5
6#[cfg(any(feature = "json", feature = "ron", feature = "binary"))]
7#[macro_use]
8mod shared;
9
10#[cfg(feature = "binary")]
11mod serde_bin;
12#[cfg(feature = "binary")]
13use crate::serde_bin::*;
14
15#[cfg(feature = "ron")]
16mod serde_ron;
17#[cfg(feature = "ron")]
18use crate::serde_ron::*;
19
20#[cfg(feature = "json")]
21mod serde_json;
22#[cfg(feature = "json")]
23use crate::serde_json::*;
24
25#[cfg(any(feature = "json", feature = "ron", feature = "binary"))]
26mod parse;
27
28#[cfg(feature = "binary")]
29#[proc_macro_derive(SerBin, attributes(nserde))]
30pub fn derive_ser_bin(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
31 let input = parse::parse_data(input);
32
33 let crate_name = shared::attrs_crate(input.attributes()).unwrap_or("nanoserde");
34
35 if let Some(proxy) = shared::attrs_proxy(input.attributes()) {
36 return derive_ser_bin_proxy(&proxy, input.name(), crate_name);
37 }
38
39 match &input {
41 parse::Data::Struct(struct_) if struct_.named => derive_ser_bin_struct(struct_, crate_name),
42 parse::Data::Struct(struct_) => derive_ser_bin_struct_unnamed(struct_, crate_name),
43 parse::Data::Enum(enum_) => derive_ser_bin_enum(enum_, crate_name),
44 _ => unimplemented!("Only structs and enums are supported"),
45 }
46}
47
48#[cfg(feature = "binary")]
49#[proc_macro_derive(DeBin, attributes(nserde))]
50pub fn derive_de_bin(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
51 let input = parse::parse_data(input);
52
53 let crate_name = shared::attrs_crate(input.attributes()).unwrap_or("nanoserde");
54
55 if let Some(proxy) = shared::attrs_proxy(input.attributes()) {
56 return derive_de_bin_proxy(&proxy, input.name(), crate_name);
57 }
58
59 match &input {
61 parse::Data::Struct(struct_) if struct_.named => derive_de_bin_struct(struct_, crate_name),
62 parse::Data::Struct(struct_) => derive_de_bin_struct_unnamed(struct_, crate_name),
63 parse::Data::Enum(enum_) => derive_de_bin_enum(enum_, crate_name),
64
65 _ => unimplemented!("Only structs and enums are supported"),
66 }
67}
68
69#[cfg(feature = "ron")]
70#[proc_macro_derive(SerRon, attributes(nserde))]
71pub fn derive_ser_ron(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
72 let input = parse::parse_data(input);
73
74 let crate_name = shared::attrs_crate(input.attributes()).unwrap_or("nanoserde");
75
76 if let Some(proxy) = shared::attrs_proxy(input.attributes()) {
77 return derive_ser_ron_proxy(&proxy, input.name(), crate_name);
78 }
79
80 match &input {
82 parse::Data::Struct(struct_) if struct_.named => derive_ser_ron_struct(struct_, crate_name),
83 parse::Data::Struct(struct_) => derive_ser_ron_struct_unnamed(struct_, crate_name),
84 parse::Data::Enum(enum_) => derive_ser_ron_enum(enum_, crate_name),
85 _ => unimplemented!("Only structs and enums are supported"),
86 }
87}
88
89#[cfg(feature = "ron")]
90#[proc_macro_derive(DeRon, attributes(nserde))]
91pub fn derive_de_ron(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
92 let input = parse::parse_data(input);
93
94 let crate_name = shared::attrs_crate(input.attributes()).unwrap_or("nanoserde");
95
96 if let Some(proxy) = shared::attrs_proxy(input.attributes()) {
97 return derive_de_ron_proxy(&proxy, input.name(), crate_name);
98 }
99
100 match &input {
102 parse::Data::Struct(struct_) if struct_.named => derive_de_ron_struct(struct_, crate_name),
103 parse::Data::Struct(struct_) => derive_de_ron_struct_unnamed(struct_, crate_name),
104 parse::Data::Enum(enum_) => derive_de_ron_enum(enum_, crate_name),
105 _ => unimplemented!("Only structs and enums are supported"),
106 }
107}
108
109#[cfg(feature = "json")]
110#[proc_macro_derive(SerJson, attributes(nserde))]
111pub fn derive_ser_json(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
112 let input = parse::parse_data(input);
113
114 let crate_name = shared::attrs_crate(input.attributes()).unwrap_or("nanoserde");
115
116 if let Some(proxy) = shared::attrs_proxy(input.attributes()) {
117 return derive_ser_json_proxy(&proxy, input.name(), crate_name);
118 }
119
120 match &input {
122 parse::Data::Struct(struct_) if struct_.named => {
123 derive_ser_json_struct(struct_, crate_name)
124 }
125 parse::Data::Struct(struct_) => derive_ser_json_struct_unnamed(struct_, crate_name),
126 parse::Data::Enum(enum_) => derive_ser_json_enum(enum_, crate_name),
127 _ => unimplemented!(""),
128 }
129}
130
131#[cfg(feature = "json")]
132#[proc_macro_derive(DeJson, attributes(nserde))]
133pub fn derive_de_json(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
134 let input = parse::parse_data(input);
135
136 let crate_name = shared::attrs_crate(input.attributes()).unwrap_or("nanoserde");
137
138 if let Some(proxy) = shared::attrs_proxy(input.attributes()) {
139 return derive_de_json_proxy(&proxy, input.name(), crate_name);
140 }
141
142 match &input {
144 parse::Data::Struct(struct_) if struct_.named => derive_de_json_struct(struct_, crate_name),
145 parse::Data::Struct(struct_) => derive_de_json_struct_unnamed(struct_, crate_name),
146 parse::Data::Enum(enum_) => derive_de_json_enum(enum_, crate_name),
147 parse::Data::Union(_) => unimplemented!("Unions are not supported"),
148 }
149}