bitcode_derive/
lib.rs

1use crate::decode::Decode;
2use crate::encode::Encode;
3use crate::shared::Derive;
4use proc_macro::TokenStream;
5use quote::quote;
6use syn::spanned::Spanned;
7use syn::{parse_macro_input, DeriveInput, Error};
8
9mod attribute;
10mod bound;
11mod decode;
12mod encode;
13mod shared;
14
15macro_rules! derive {
16    ($fn_name:ident, $trait_:ident) => {
17        #[proc_macro_derive($trait_, attributes(bitcode))]
18        pub fn $fn_name(input: TokenStream) -> TokenStream {
19            $trait_
20                .derive(parse_macro_input!(input as DeriveInput))
21                .unwrap_or_else(Error::into_compile_error)
22                .into()
23        }
24    };
25}
26derive!(derive_encode, Encode);
27derive!(derive_decode, Decode);
28
29pub(crate) fn error(spanned: &impl Spanned, s: &str) -> Error {
30    Error::new(spanned.span(), s.to_owned())
31}
32
33pub(crate) fn err<T>(spanned: &impl Spanned, s: &str) -> Result<T, Error> {
34    Err(error(spanned, s))
35}
36
37pub(crate) fn private(crate_name: &syn::Path) -> proc_macro2::TokenStream {
38    quote! { #crate_name::__private }
39}