obi_derive/
lib.rs

1extern crate proc_macro;
2use obi_derive_internal::*;
3use proc_macro::TokenStream;
4use syn::ItemStruct;
5
6#[proc_macro_derive(OBIEncode)]
7pub fn obi_encode(input: TokenStream) -> TokenStream {
8    let res = if let Ok(input) = syn::parse::<ItemStruct>(input.clone()) {
9        struct_enc(&input)
10    } else {
11        // Derive macros can only be defined on structs
12        unreachable!()
13    };
14    TokenStream::from(match res {
15        Ok(res) => res,
16        Err(err) => err.to_compile_error(),
17    })
18}
19
20#[proc_macro_derive(OBIDecode)]
21pub fn obi_decode(input: TokenStream) -> TokenStream {
22    let res = if let Ok(input) = syn::parse::<ItemStruct>(input.clone()) {
23        struct_dec(&input)
24    } else {
25        // Derive macros can only be defined on structs.
26        unreachable!()
27    };
28    TokenStream::from(match res {
29        Ok(res) => res,
30        Err(err) => err.to_compile_error(),
31    })
32}
33
34#[proc_macro_derive(OBISchema)]
35pub fn obi_schema(input: TokenStream) -> TokenStream {
36    let res = if let Ok(input) = syn::parse::<ItemStruct>(input.clone()) {
37        process_struct(&input)
38    } else {
39        // Derive macros can only be defined on structs.
40        unreachable!()
41    };
42    TokenStream::from(match res {
43        Ok(res) => res,
44        Err(err) => err.to_compile_error(),
45    })
46}