amfiteatr_proc_macro/
lib.rs1mod token_parsed;
2mod token_variant;
4
5use quote::quote;
6
7use syn::{DeriveInput, ItemStruct, parse_macro_input};
8use crate::token_parsed::{derive_code_token_parsed};
10use crate::token_variant::derive_code_token_variant;
11
12#[proc_macro_attribute]
13pub fn no_assessment_info_set(attr: proc_macro::TokenStream, item: proc_macro::TokenStream) -> proc_macro::TokenStream{
14
15 let item_copy = item.clone();
16
17 let input: ItemStruct = parse_macro_input!(item_copy);
18
19 let domain = parse_macro_input!(attr as syn::Path);
20 let ident = input.ident;
21 let generics = input.generics;
22 let where_clause = generics.where_clause;
23 let params = generics.params;
24
25
26 let implementation = match params.is_empty(){
27 true => quote!{
28 impl amfiteatr_core::agent::EvaluatedInformationSet<#domain, amfiteatr_core::domain::NoneReward> for #ident{
29
30 fn current_assessment(&self) -> amfiteatr_core::domain::NoneReward{
31 amfiteatr_core::domain::NoneReward{}
32 }
33 fn penalty_for_illegal(&self) -> amfiteatr_core::domain::NoneReward {
34 amfiteatr_core::domain::NoneReward{}
35 }
36 }
37 },
38 false => quote!{
39 impl<#params> amfiteatr_core::agent::EvaluatedInformationSet<#domain, amfiteatr_core::domain::NoneReward> for #ident <#params>
40 #where_clause{
41
42 fn current_assessment(&self) -> amfiteatr_core::domain::NoneReward {
43 amfiteatr_core::domain::NoneReward{}
44 }
45 fn penalty_for_illegal(&self) -> amfiteatr_core::domain::NoneReward {
46 amfiteatr_core::domain::NoneReward{}
47 }
48 }
49 }
50 };
51 let result = [item, implementation.into()];
52 proc_macro::TokenStream::from_iter(result)
53
54
55
56
57
58}
59
60#[proc_macro_derive(TokenParsed, attributes(token, token_type))]
71pub fn derive_token_parsed(item: proc_macro::TokenStream) -> proc_macro::TokenStream{
72 let input = parse_macro_input!(item as DeriveInput);
73 derive_code_token_parsed(input)
74}
75
76#[proc_macro_derive(TokenVariant, attributes(primitive))]
77pub fn derive_token_variant(item: proc_macro::TokenStream) -> proc_macro::TokenStream{
78 let input = parse_macro_input!(item as DeriveInput);
79 derive_code_token_variant(input)
80}