1
#![doc = include_str!("../README.md")]
2
#![forbid(unsafe_code)]
3

            
4
use quote::quote;
5
use syn::ItemFn;
6
use syn::parse_macro_input;
7

            
8
mod merc_derive_terms;
9
use merc_derive_terms::merc_derive_terms_impl;
10

            
11
/// This proc macro can be used to automatically generate the boilerplate code
12
/// for structs to behave as a term.
13
#[proc_macro_attribute]
14
15
pub fn merc_derive_terms(
15
15
    _attributes: proc_macro::TokenStream,
16
15
    input: proc_macro::TokenStream,
17
15
) -> proc_macro::TokenStream {
18
15
    merc_derive_terms_impl(
19
15
        proc_macro2::TokenStream::from(_attributes),
20
15
        proc_macro2::TokenStream::from(input),
21
    )
22
15
    .into()
23
15
}
24

            
25
/// Marks a struct as a term.
26
#[proc_macro_attribute]
27
33
pub fn merc_term(_attributes: proc_macro::TokenStream, input: proc_macro::TokenStream) -> proc_macro::TokenStream {
28
33
    input
29
33
}
30

            
31
/// Marks a function to be ignored, meaning the Ref term will not have this function
32
#[proc_macro_attribute]
33
60
pub fn merc_ignore(_attributes: proc_macro::TokenStream, input: proc_macro::TokenStream) -> proc_macro::TokenStream {
34
60
    input
35
60
}
36

            
37
/// A macro that makes the function marked as a `#[test]` function and also initializes the test_logger().
38
#[proc_macro_attribute]
39
8
pub fn merc_test(_attr: proc_macro::TokenStream, item: proc_macro::TokenStream) -> proc_macro::TokenStream {
40
8
    let input = parse_macro_input!(item as ItemFn);
41

            
42
8
    let block = &input.block;
43
8
    let attrs = &input.attrs;
44
8
    let sig = &input.sig;
45

            
46
8
    let output = quote! {
47
        #[test]
48
        #(#attrs)*
49
        #sig {
50
            let __logger = merc_utilities::test_logger();
51
            #block
52
        }
53
    };
54

            
55
8
    output.into()
56
8
}