edict_proc/
lib.rs

1use std::str::FromStr;
2
3use proc_macro::TokenStream;
4
5#[proc_macro_derive(Component, attributes(edict))]
6pub fn derive_component(item: TokenStream) -> TokenStream {
7    let path: syn::Path = syn::parse_quote!(edict);
8    edict_proc_lib::derive_component(item.into(), &path, path.get_ident().unwrap()).into()
9}
10
11#[proc_macro_derive(Relation, attributes(edict))]
12pub fn derive_relation(item: TokenStream) -> TokenStream {
13    let path: syn::Path = syn::parse_quote!(edict);
14    edict_proc_lib::derive_relation(item.into(), &path, path.get_ident().unwrap()).into()
15}
16
17// #[proc_macro_derive(Query, attributes(edict))]
18// pub fn derive_query(item: TokenStream) -> TokenStream {
19//     let path: syn::Path = syn::parse_quote!(edict);
20//     edict_proc_lib::derive_query(item.into(), &path, path.get_ident().unwrap()).into()
21// }
22
23/// This attribute adds checks for system functions.
24/// Only applicable to function items.
25///
26/// Generates compilation error if function is has type parameters,
27/// is async, unsafe, has return type or is a method.
28///
29/// Checks that all function arguments are valid system arguments.
30///
31/// And finally checks that function is a system.
32#[proc_macro_attribute]
33pub fn system(attr: TokenStream, item: TokenStream) -> TokenStream {
34    if !attr.is_empty() {
35        return TokenStream::from_str(
36            "::core::compile_error!(\"`#[system]` attribute doesn't take any arguments\");",
37        )
38        .unwrap();
39    }
40
41    let item = syn::parse_macro_input!(item as syn::ItemFn);
42
43    let path: syn::Path = syn::parse_quote!(edict);
44    match edict_proc_lib::system(item, &path) {
45        Ok(output) => output.into(),
46        Err(err) => err.to_compile_error().into(),
47    }
48}