serum_borsh_derive/
lib.rs1extern crate proc_macro;
2use proc_macro::TokenStream;
3use serum_borsh_derive_internal::*;
4use serum_borsh_schema_derive_internal::*;
5use syn::export::Span;
6use syn::{ItemEnum, ItemStruct, ItemUnion};
7
8#[proc_macro_derive(BorshSerialize, attributes(borsh_skip))]
9pub fn borsh_serialize(input: TokenStream) -> TokenStream {
10 let res = if let Ok(input) = syn::parse::<ItemStruct>(input.clone()) {
11 struct_ser(&input)
12 } else if let Ok(input) = syn::parse::<ItemEnum>(input.clone()) {
13 enum_ser(&input)
14 } else if let Ok(input) = syn::parse::<ItemUnion>(input.clone()) {
15 union_ser(&input)
16 } else {
17 unreachable!()
19 };
20 TokenStream::from(match res {
21 Ok(res) => res,
22 Err(err) => err.to_compile_error(),
23 })
24}
25
26#[proc_macro_derive(BorshDeserialize, attributes(borsh_skip, borsh_init))]
27pub fn borsh_deserialize(input: TokenStream) -> TokenStream {
28 let res = if let Ok(input) = syn::parse::<ItemStruct>(input.clone()) {
29 struct_de(&input)
30 } else if let Ok(input) = syn::parse::<ItemEnum>(input.clone()) {
31 enum_de(&input)
32 } else if let Ok(input) = syn::parse::<ItemUnion>(input.clone()) {
33 union_de(&input)
34 } else {
35 unreachable!()
37 };
38 TokenStream::from(match res {
39 Ok(res) => res,
40 Err(err) => err.to_compile_error(),
41 })
42}
43
44#[proc_macro_derive(BorshSchema, attributes(borsh_skip))]
45pub fn borsh_schema(input: TokenStream) -> TokenStream {
46 let res = if let Ok(input) = syn::parse::<ItemStruct>(input.clone()) {
47 process_struct(&input)
48 } else if let Ok(input) = syn::parse::<ItemEnum>(input.clone()) {
49 process_enum(&input)
50 } else if let Ok(_) = syn::parse::<ItemUnion>(input.clone()) {
51 Err(syn::Error::new(
52 Span::call_site(),
53 "Borsh schema does not support unions yet.",
54 ))
55 } else {
56 unreachable!()
58 };
59 TokenStream::from(match res {
60 Ok(res) => res,
61 Err(err) => err.to_compile_error(),
62 })
63}