Skip to content

Commit bfb9948

Browse files
committed
refactor: use generic builder
1 parent 3dbb397 commit bfb9948

2 files changed

Lines changed: 42 additions & 35 deletions

File tree

  • godot-core/src/obj
  • godot-macros/src/class/data_models

godot-core/src/obj/rpc.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,39 @@ use crate::r#gen::classes::Node;
1010
use crate::r#gen::virtuals::RefCounted::Gd;
1111
use crate::obj::{GodotClass, Inherits, WithBaseField};
1212

13+
/// Holds:
14+
/// * A [`UserRpcObject`], which the represented RPC is called on.
15+
/// * A [`&str`], which represents the name of an RPC,
16+
/// * A [`Vec`] of [`Variants`] that is a list of parameters passed to the RPC when called.
17+
pub struct GenericRpcBuilder<'c, C: GodotClass> {
18+
object: UserRpcObject<'c, C>,
19+
rpc_name: &'c str,
20+
parameters: Vec<Variant>,
21+
}
22+
23+
impl<'c, C: GodotClass> GenericRpcBuilder<'c, C> {
24+
pub fn new(object: UserRpcObject<'c, C>, rpc_name: &'c str, parameters: Vec<Variant>) -> Self {
25+
Self {
26+
object,
27+
rpc_name,
28+
parameters,
29+
}
30+
}
31+
}
32+
33+
impl<'c, C> GenericRpcBuilder<'c, C>
34+
where
35+
C: WithBaseField + Inherits<Node>,
36+
{
37+
pub fn call(self) {
38+
self.object.call_rpc(self.rpc_name, &self.parameters);
39+
}
40+
41+
pub fn call_id(self, id: i64) {
42+
self.object.call_rpc_id(self.rpc_name, id, &self.parameters);
43+
}
44+
}
45+
1346
/// Holds either an [`Internal`](Self::Internal) reference of `&mut C` or an [`External`](Self::External) [`Gd`] pointer to `C`.
1447
///
1548
/// If `C` implements [`WithBaseField`] and [`Inherits`] [`Node`], the [`call_rpc()`](Self::call_rpc()) and

godot-macros/src/class/data_models/rpc.rs

Lines changed: 9 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -173,11 +173,11 @@ pub fn make_rpc_api(for_class: &Ident, rpcs: Vec<&FuncDefinition>) -> TokenStrea
173173
let collection_name = format_ident!("__{for_class}RpcCollection");
174174

175175
let mut collection_impl_methods = TokenStream::new();
176-
let mut rpc_builders = TokenStream::new();
177176
for rpc in rpcs {
177+
// TODO: Support functions with optional parameters
178+
178179
let rpc_name = rpc.rust_ident();
179180
// TODO: is this an okay name?
180-
let rpc_builder_name = format_ident!("__RpcBuilder_{}", rpc.rust_ident());
181181
let param_idents = &rpc.signature_info.param_idents;
182182
let rpc_typed_args: TokenStream = param_idents
183183
.iter()
@@ -189,39 +189,15 @@ pub fn make_rpc_api(for_class: &Ident, rpcs: Vec<&FuncDefinition>) -> TokenStrea
189189
})
190190
.collect();
191191
let rpc_args = param_idents.iter().map(|name| quote! { #name });
192-
let rpc_args_2 = rpc_args.clone();
193-
let rpc_self_args: TokenStream = param_idents
194-
.iter()
195-
.map(|name| quote! { self.#name, })
196-
.collect();
197192

198193
collection_impl_methods.append_all(quote! {
199194
#[must_use]
200-
pub fn #rpc_name(self, #rpc_typed_args) -> #rpc_builder_name<'c> {
201-
#rpc_builder_name {
202-
object: self.object,
203-
#( #rpc_args: #rpc_args.to_variant() ),*
204-
}
205-
}
206-
});
207-
208-
rpc_builders.append_all(quote! {
209-
#[doc(hidden)]
210-
pub struct #rpc_builder_name<'c>
211-
{
212-
object: UserRpcObject<'c, #for_class>,
213-
#( #rpc_args_2: Variant ),*
214-
}
215-
216-
impl<'c> #rpc_builder_name<'c>
217-
{
218-
pub fn call(mut self) {
219-
self.object.call_rpc(stringify!(#rpc_name), &[#rpc_self_args]);
220-
}
221-
222-
pub fn call_id(mut self, id: i64) {
223-
self.object.call_rpc_id(stringify!(#rpc_name), id, &[#rpc_self_args]);
224-
}
195+
pub fn #rpc_name(self, #rpc_typed_args) -> GenericRpcBuilder<'c, #for_class> {
196+
GenericRpcBuilder::new(
197+
self.object,
198+
stringify!(#rpc_name),
199+
vec![#( #rpc_args.to_variant() ),*],
200+
)
225201
}
226202
});
227203
}
@@ -235,7 +211,7 @@ pub fn make_rpc_api(for_class: &Ident, rpcs: Vec<&FuncDefinition>) -> TokenStrea
235211
#![allow(non_camel_case_types)]
236212

237213
use super::*;
238-
use ::godot::obj::{RpcCollection, UserRpcObject};
214+
use ::godot::obj::{RpcCollection, UserRpcObject, GenericRpcBuilder};
239215

240216
#[doc(hidden)]
241217
pub struct #collection_name<'c>
@@ -269,8 +245,6 @@ pub fn make_rpc_api(for_class: &Ident, rpcs: Vec<&FuncDefinition>) -> TokenStrea
269245
)
270246
}
271247
}
272-
273-
#rpc_builders
274248
}
275249
}
276250
}

0 commit comments

Comments
 (0)