use darling::FromDeriveInput;
use quote::{quote, ToTokens};
use syn::Ident;
#[derive(FromDeriveInput)]
#[darling(attributes(action))]
pub struct ActionImpl {
ident: Ident,
name: String,
}
impl ActionImpl {
fn generate_rule(&self) -> proc_macro2::TokenStream {
let rule_name = format!("{}Rule", self.ident);
let rule_ident = Ident::new(&rule_name, self.ident.span());
let pattern = format!("{{\"action\":\"{}\"", self.name);
quote! {
pub struct #rule_ident;
impl ::binary_options_tools_core_pre::traits::Rule for #rule_ident {
fn call(&self, msg: &::binary_options_tools_core_pre::reimports::Message) -> bool {
if let ::binary_options_tools_core_pre::reimports::Message::Binary(text) = msg {
text.starts_with(#pattern.as_bytes())
} else {
false
}
}
fn reset(&self) {
}
}
}
}
pub fn generate_impl(&self) -> proc_macro2::TokenStream {
let ident = &self.ident;
let action_name = &self.name;
let rule = self.generate_rule();
quote! {
#rule
impl ActionName for #ident {
fn name(&self) -> &str {
#action_name
}
}
}
}
}
impl ToTokens for ActionImpl {
fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
let impl_tokens = self.generate_impl();
tokens.extend(impl_tokens);
}
}