1use proc_macro::TokenStream;
2
3mod system;
4mod query;
5mod component;
6mod entity;
7mod flags;
8
9#[proc_macro_attribute]
14pub fn system(attr: TokenStream, item: TokenStream) -> TokenStream {
15 crate::system::system_macro(attr, item)
16}
17
18#[proc_macro]
23pub fn query(item: TokenStream) -> TokenStream {
27 crate::query::gen_query_tokens(item, "query")
28}
29
30#[proc_macro]
31pub fn query_mut(item: TokenStream) -> TokenStream {
35 crate::query::gen_query_tokens(item, "query_mut")
36}
37
38#[proc_macro]
39pub fn query_mut_ptr(_item: TokenStream) -> TokenStream {
43 unimplemented!("Mut queries with pointers is currently not supported. These will be reintroduced in a future version.")
44}
45
46#[proc_macro]
51pub fn spawn_entity(item: TokenStream) -> TokenStream {
52 crate::entity::spawn_entity_macro(item)
53}
54
55#[proc_macro_derive(Component)]
60pub fn derive_component(item: TokenStream) -> TokenStream {
61 let ast: syn::DeriveInput = syn::parse(item).unwrap();
62 let field_less = match &ast.data {
63 syn::Data::Struct(data) => {
64 data.fields == syn::Fields::Unit
65 },
66 syn::Data::Enum(_) |
67 syn::Data::Union(_) => false,
68 };
69
70 if field_less {
71 panic!("`#[derive(Component)]` cannot be applied to unit structs. Unit struct can not be used as component, but should be used as flags, use `#[derive(Flag)]` instead.")
72 }
73
74 let name = &ast.ident;
75 let generics_and_lifetimes = &ast.generics;
76
77 let ts = TokenStream::from(crate::component::derive_component_impl(name, generics_and_lifetimes));
78
79 ts
80}
81
82#[proc_macro_attribute]
83pub fn flags(_attr: TokenStream, item: TokenStream) -> TokenStream {
84 crate::flags::gen_flags_tokens(item)
85}