Skip to main content

serum_borsh_derive/
lib.rs

1extern 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        // Derive macros can only be defined on structs, enums, and unions.
18        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        // Derive macros can only be defined on structs, enums, and unions.
36        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        // Derive macros can only be defined on structs, enums, and unions.
57        unreachable!()
58    };
59    TokenStream::from(match res {
60        Ok(res) => res,
61        Err(err) => err.to_compile_error(),
62    })
63}