naia_derive/
lib.rs

1//! # Naia Derive
2//! Procedural macros to simplify implementation of Naia types
3
4#![deny(trivial_casts, trivial_numeric_casts, unstable_features)]
5
6use quote::quote;
7
8mod channel;
9mod message;
10mod replicate;
11mod shared;
12
13use channel::channel_impl;
14use message::message_impl;
15use replicate::replicate_impl;
16
17// Replicate
18
19/// Derives the Replicate trait for a given struct
20#[proc_macro_derive(Replicate)]
21pub fn replicate_derive_shared(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
22    let shared_crate_name = quote! { naia_shared };
23    replicate_impl(input, shared_crate_name)
24}
25
26/// Derives the Replicate trait for a given struct, for the Bevy adapter
27#[proc_macro_derive(ReplicateBevy)]
28pub fn replicate_derive_bevy(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
29    let shared_crate_name = quote! { naia_bevy_shared };
30    replicate_impl(input, shared_crate_name)
31}
32
33/// Derives the Replicate trait for a given struct, for the Bevy adapter
34#[proc_macro_derive(ReplicateHecs)]
35pub fn replicate_derive_hecs(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
36    let shared_crate_name = quote! { naia_hecs_shared };
37    replicate_impl(input, shared_crate_name)
38}
39
40// Channel
41
42/// Derives the Channel trait for a given struct
43#[proc_macro_derive(Channel)]
44pub fn channel_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
45    channel_impl(input)
46}
47
48// Message
49
50/// Derives the Message trait for a given struct, for internal
51#[proc_macro_derive(MessageInternal)]
52pub fn message_derive_internal(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
53    let shared_crate_name = quote! { crate };
54    message_impl(input, shared_crate_name, false, false)
55}
56
57/// Derives the Message trait for a given struct, for FragmentedMessage
58#[proc_macro_derive(MessageFragment)]
59pub fn message_derive_fragment(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
60    let shared_crate_name = quote! { crate };
61    message_impl(input, shared_crate_name, true, false)
62}
63
64/// Derives the Message trait for a given struct, for RequestMessage
65#[proc_macro_derive(MessageRequest)]
66pub fn message_derive_request(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
67    let shared_crate_name = quote! { crate };
68    message_impl(input, shared_crate_name, false, true)
69}
70
71/// Derives the Message trait for a given struct
72#[proc_macro_derive(Message)]
73pub fn message_derive_shared(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
74    let shared_crate_name = quote! { naia_shared };
75    message_impl(input, shared_crate_name, false, false)
76}
77
78/// Derives the Message trait for a given struct, for the Bevy adapter
79#[proc_macro_derive(MessageBevy)]
80pub fn message_derive_bevy(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
81    let shared_crate_name = quote! { naia_bevy_shared };
82    message_impl(input, shared_crate_name, false, false)
83}
84
85/// Derives the Message trait for a given struct, for the Hecs adapter
86#[proc_macro_derive(MessageHecs)]
87pub fn message_derive_hecs(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
88    let shared_crate_name = quote! { naia_hecs_shared };
89    message_impl(input, shared_crate_name, false, false)
90}