extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, Data, DataEnum, DeriveInput, Ident, Variant};
#[proc_macro_attribute]
pub fn croncat_error(_attrs: TokenStream, input: TokenStream) -> TokenStream {
let mut input = parse_macro_input!(input as DeriveInput);
let enum_name = input.ident.clone();
let mut is_croncat_error_present = false;
if let Data::Enum(DataEnum {
ref mut variants, ..
}) = input.data
{
for variant in variants.iter() {
if variant.ident == Ident::new("CronCatError", variant.ident.span()) {
is_croncat_error_present = true;
}
}
if !is_croncat_error_present {
let croncat_error_variant: Variant = syn::parse_quote! {
#[error("CronCat error: {err:?}")]
CronCatError {
err: croncat_integration_utils::error::CronCatContractError,
}
};
variants.push(croncat_error_variant);
}
}
let expanded = quote! {
#input
impl From<croncat_integration_utils::error::CronCatContractError> for #enum_name {
fn from(error: croncat_integration_utils::error::CronCatContractError) -> Self {
#enum_name::CronCatError {
err: error,
}
}
}
};
TokenStream::from(expanded)
}