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_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}