Skip to content

Commit 944805d

Browse files
committed
feat(core): support easier, type-safe deferred calls
1 parent 81f9d7c commit 944805d

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

godot-core/src/obj/gd.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,23 @@ impl<T: GodotClass> Gd<T> {
444444
})
445445
}
446446

447+
/// Runs the given Closure deferred.
448+
///
449+
/// The closure receives a reference to this object back.
450+
/// This can be a type-safe alternative to [`Object::call_deferred`], but does not handle
451+
/// dynamic dispatch, unless explicitly used.
452+
pub fn apply_deferred<F>(&mut self, mut rust_function: F)
453+
where
454+
F: FnMut(Gd<T>) + 'static,
455+
{
456+
let this = self.clone();
457+
let callable = Callable::from_local_fn("apply_deferred", move |_| {
458+
rust_function(this.clone());
459+
Ok(Variant::nil())
460+
});
461+
callable.call_deferred(&[]);
462+
}
463+
447464
/// Returns `Ok(cast_obj)` on success, `Err(self)` on error.
448465
// Visibility: used by DynGd.
449466
pub(crate) fn owned_cast<U>(self) -> Result<Gd<U>, Self>

itest/rust/src/object_tests/deferred_call_test.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,20 @@ impl INode for DeferredTestNode {
6262
fn calls_method_names_deferred(ctx: &crate::framework::TestContext) -> TaskHandle {
6363
let mut test_node = DeferredTestNode::new_alloc();
6464
ctx.scene_tree.clone().add_child(&test_node);
65-
65+
6666
test_node.call_deferred("accept", &[]);
6767

6868
let handle = test_node.bind().as_expectation_task();
6969
handle
7070
}
71+
72+
#[itest(async)]
73+
fn calls_closure_deferred(ctx: &crate::framework::TestContext) -> TaskHandle {
74+
let mut test_node = DeferredTestNode::new_alloc();
75+
ctx.scene_tree.clone().add_child(&test_node);
76+
77+
test_node.apply_deferred(|mut this| this.bind_mut().accept());
78+
79+
let handle = test_node.bind().as_expectation_task();
80+
handle
81+
}

0 commit comments

Comments
 (0)