use proc_macro2::TokenStream as TokenStream2;
pub fn derive(attr: TokenStream2, item: TokenStream2) -> syn::Result<TokenStream2> {
let mut encode = false;
let mut decode = false;
let mut type_info = false;
syn::parse::Parser::parse2(
syn::meta::parser(|meta| {
if meta.path.is_ident("Encode") {
encode = true;
Ok(())
} else if meta.path.is_ident("Decode") {
decode = true;
Ok(())
} else if meta.path.is_ident("TypeInfo") {
type_info = true;
Ok(())
} else {
Err(meta.error(
"unsupported scale derive: expected Encode, Decode or TypeInfo",
))
}
}),
attr,
)?;
let codec_crate =
(encode || decode).then(|| quote::quote!(#[codec(crate = ::ink::scale)]));
let encode = encode.then(|| quote::quote!(#[derive(::ink::scale::Encode)]));
let decode = decode.then(|| quote::quote!(#[derive(::ink::scale::Decode)]));
let type_info = type_info.then(|| {
quote::quote!(
#[cfg_attr(
feature = "std",
derive(::ink::scale_info::TypeInfo),
scale_info(crate = ::ink::scale_info)
)]
)
});
Ok(quote::quote!(
#encode
#decode
#codec_crate
#type_info
#item
))
}