kiwi_macros/
lib.rs

1use proc_macro::TokenStream;
2
3mod system;
4mod query;
5mod component;
6mod entity;
7mod flags;
8
9//======================
10// System
11//======================
12
13#[proc_macro_attribute]
14pub fn system(attr: TokenStream, item: TokenStream) -> TokenStream {
15    crate::system::system_macro(attr, item)
16}
17
18//==============
19// Query
20//==============
21
22#[proc_macro]
23/// Takes the following parameters:
24/// - world: &World
25/// - ...components: ...Component
26pub fn query(item: TokenStream) -> TokenStream {
27    crate::query::gen_query_tokens(item, "query")
28}
29
30#[proc_macro]
31/// Takes the following parameters:
32/// - world: &mut World
33/// - ...components: ...Component
34pub fn query_mut(item: TokenStream) -> TokenStream {
35    crate::query::gen_query_tokens(item, "query_mut")
36}
37
38#[proc_macro]
39/// Takes the following parameters:
40/// - world: &mut World
41/// - ...components: ...Component
42pub 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//==============
47// Spawn entity
48//==============
49
50#[proc_macro]
51pub fn spawn_entity(item: TokenStream) -> TokenStream {
52    crate::entity::spawn_entity_macro(item)
53}
54
55//======================
56// Component
57//======================
58
59#[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}