unity_mirror_macro_rs/
lib.rs

1mod namespace;
2mod network_behaviour;
3
4use proc_macro::TokenStream;
5
6mod callback_processor;
7mod metadata_settings;
8mod network_message;
9
10mod network_manager;
11
12mod network_manager_factory;
13
14pub(crate) mod utils;
15
16mod mirror;
17
18mod extends;
19
20macro_rules! attribute_args {
21    ($type_name:ident, $($field_name:ident),+) => {
22        #[derive(Default)]
23        #[allow(unused)]
24        struct $type_name {
25            $($field_name: Option<String>,)*
26        }
27
28
29        impl syn::parse::Parse for $type_name {
30            fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
31                use quote::ToTokens;
32
33                let mut result= $type_name::default();
34
35                while !input.is_empty() {
36                    let name_value: syn::MetaNameValue = input.parse()?;
37                    let key = name_value.path.to_token_stream().to_string();
38                    let value = name_value.value.to_token_stream();
39
40                    match key.as_str() {
41                        $(stringify!($field_name) => {
42                            result.$field_name = Some(value.to_string().trim_matches('"').to_string());
43                        },)*
44                        _ => {}
45                    }
46
47                    if input.peek(syn::Token![,]) {
48                        input.parse::<syn::Token![,]>()?;
49                    }
50                }
51
52                Ok(result)
53            }
54        }
55    };
56}
57
58//  #[sync_var]
59//  #[sync_obj]
60#[proc_macro_attribute]
61pub fn network_behaviour(attr: TokenStream, item: TokenStream) -> TokenStream {
62    network_behaviour::handler(attr, item)
63}
64
65#[proc_macro_attribute]
66pub fn metadata(_: TokenStream, _: TokenStream) -> TokenStream {
67    TokenStream::new()
68}
69
70attribute_args!(NamespaceArgs, prefix, rename);
71#[proc_macro_attribute]
72pub fn namespace(attr: TokenStream, item: TokenStream) -> TokenStream {
73    namespace::handler(attr, item)
74}
75
76#[proc_macro_derive(MetadataSettingsWrapper)]
77pub fn derive_metadata_settings_wrapper(input: TokenStream) -> TokenStream {
78    metadata_settings::wrapper::handler(input)
79}
80
81#[proc_macro]
82pub fn settings_wrapper_register(input: TokenStream) -> TokenStream {
83    metadata_settings::wrapper_register::handler(input)
84}
85
86#[proc_macro_derive(SyncState, attributes(sync_var, sync_obj))]
87pub fn derive_sync_state(_: TokenStream) -> TokenStream {
88    TokenStream::new()
89}
90
91#[proc_macro_attribute]
92pub fn ancestor_on_serialize(attr: TokenStream, item: TokenStream) -> TokenStream {
93    network_behaviour::ancestor_on_serialize(attr, item)
94}
95
96#[proc_macro_attribute]
97pub fn ancestor_on_deserialize(attr: TokenStream, item: TokenStream) -> TokenStream {
98    network_behaviour::ancestor_on_deserialize(attr, item)
99}
100
101#[proc_macro_attribute]
102pub fn parent_on_serialize(attr: TokenStream, item: TokenStream) -> TokenStream {
103    network_behaviour::parent_on_serialize(attr, item)
104}
105
106#[proc_macro_attribute]
107pub fn parent_on_deserialize(attr: TokenStream, item: TokenStream) -> TokenStream {
108    network_behaviour::parent_on_deserialize(attr, item)
109}
110
111#[proc_macro_derive(NetworkMessage)]
112pub fn message(input: TokenStream) -> TokenStream {
113    network_message::handler(input)
114}
115
116#[proc_macro_derive(CallbackProcessor)]
117pub fn callback_processor(input: TokenStream) -> TokenStream {
118    callback_processor::callback_processor_handler(input)
119}
120
121#[proc_macro_attribute]
122pub fn network_manager(attr: TokenStream, item: TokenStream) -> TokenStream {
123    network_manager::handler(attr, item)
124}
125
126#[proc_macro_derive(NetworkManagerFactory)]
127pub fn derive_network_manager_factory(item: TokenStream) -> TokenStream {
128    network_manager_factory::handler(item)
129}
130
131#[proc_macro_attribute]
132pub fn authenticator_factory(_: TokenStream, item: TokenStream) -> TokenStream {
133    mirror::authenticator_factory::handler(item)
134}
135
136// #[command(NetworkAnimator, authority)]
137#[proc_macro_attribute]
138pub fn command(attr: TokenStream, item: TokenStream) -> TokenStream {
139    mirror::component::command::handler(attr, item)
140}
141
142// #[client_rpc(include_owner, channel = TransportChannel::Reliable)]
143#[proc_macro_attribute]
144pub fn client_rpc(attr: TokenStream, item: TokenStream) -> TokenStream {
145    mirror::component::client_rpc::handler(attr, item)
146}
147
148#[proc_macro_attribute]
149pub fn target_rpc(attr: TokenStream, item: TokenStream) -> TokenStream {
150    mirror::component::target_rpc::handler(attr, item)
151}
152
153#[proc_macro_attribute]
154pub fn extends(attr: TokenStream, item: TokenStream) -> TokenStream {
155    extends::handler(attr, item)
156}
157
158mod action;
159#[proc_macro_attribute]
160pub fn action(attr: TokenStream, item: TokenStream) -> TokenStream {
161    action::handler(attr, item)
162}