1
//! This is the backend procedural macro crate for `conjure_rules`. USE THAT INSTEAD!
2

            
3
use proc_macro::TokenStream;
4
use quote::quote;
5
use syn::{parse_macro_input, Ident, ItemFn};
6

            
7
#[proc_macro_attribute]
8
75
pub fn register_rule(_: TokenStream, item: TokenStream) -> TokenStream {
9
75
    let func = parse_macro_input!(item as ItemFn);
10
75
    let rule_ident = &func.sig.ident;
11
75
    let static_name = format!("CONJURE_GEN_RULE_{}", rule_ident).to_uppercase();
12
75
    let static_ident = Ident::new(&static_name, rule_ident.span());
13
75

            
14
75
    let expanded = quote! {
15
75
        #func
16
75

            
17
75
        #[::conjure_rules::_dependencies::distributed_slice(::conjure_rules::RULES_DISTRIBUTED_SLICE)]
18
75
        pub static #static_ident: ::conjure_rules::_dependencies::Rule = ::conjure_rules::_dependencies::Rule {
19
75
            name: stringify!(#rule_ident),
20
75
            application: #rule_ident,
21
75
        };
22
75
    };
23
75

            
24
75
    TokenStream::from(expanded)
25
75
}