use std::str::FromStr;
use proc_macro::TokenStream;
#[proc_macro_derive(Component, attributes(edict))]
pub fn derive_component(item: TokenStream) -> TokenStream {
let path: syn::Path = syn::parse_quote!(edict);
edict_proc_lib::derive_component(item.into(), &path, path.get_ident().unwrap()).into()
}
#[proc_macro_derive(Relation, attributes(edict))]
pub fn derive_relation(item: TokenStream) -> TokenStream {
let path: syn::Path = syn::parse_quote!(edict);
edict_proc_lib::derive_relation(item.into(), &path, path.get_ident().unwrap()).into()
}
#[proc_macro_attribute]
pub fn system(attr: TokenStream, item: TokenStream) -> TokenStream {
if !attr.is_empty() {
return TokenStream::from_str(
"::core::compile_error!(\"`#[system]` attribute doesn't take any arguments\");",
)
.unwrap();
}
let item = syn::parse_macro_input!(item as syn::ItemFn);
let path: syn::Path = syn::parse_quote!(edict);
match edict_proc_lib::system(item, &path) {
Ok(output) => output.into(),
Err(err) => err.to_compile_error().into(),
}
}
#[proc_macro]
pub fn flow_fn(tokens: TokenStream) -> TokenStream {
let closure = syn::parse_macro_input!(tokens as syn::ExprClosure);
let path: syn::Path = syn::parse_quote!(edict);
match edict_proc_lib::flow_fn(closure, &path) {
Ok(output) => output.into(),
Err(err) => err.to_compile_error().into(),
}
}