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}