Skip to main content

libmotiva_macros/
lib.rs

1use proc_macro::TokenStream;
2use quote::quote;
3
4#[derive(deluxe::ParseMetaItem)]
5#[deluxe(attributes(scoring_feature))]
6struct FeatureAttributes(syn::Ident, #[deluxe(flatten)] FeatureNamedAttributes);
7
8#[derive(deluxe::ParseMetaItem)]
9struct FeatureNamedAttributes {
10  name: String,
11}
12
13#[proc_macro_attribute]
14pub fn scoring_feature(attrs: TokenStream, input: TokenStream) -> TokenStream {
15  let FeatureAttributes(ident, FeatureNamedAttributes { name }) = deluxe::parse2::<FeatureAttributes>(attrs.into()).unwrap();
16  let input = proc_macro2::TokenStream::from(input);
17
18  quote! {
19      pub struct #ident;
20
21      impl<'e> Feature<'e> for #ident {
22        fn name(&self) -> &'static str {
23            #name
24        }
25
26        #[tracing::instrument(level = "trace", name = #name, skip_all, fields(entity_id = rhs.id))]
27        #input
28      }
29  }
30  .into()
31}