Closed
Description
Currently the pattern for structs with Gd references to other nodes looks like:
#[derive(GodotClass)]
#[class(init, base=Node)]
pub struct SomeNode {
#[export]
required_node_a: Option<Gd<Node>>,
#[export]
required_node_b: Option<Gd<Node>>,
#[export]
optional_node: Option<Gd<Node>>,
...
}
#[godot_api]
impl INode for SomeNode {
fn ready(&mut self) {
let Some(required_node_a) = self.required_node_a.as_ref() else { panic!("required node must be set!")};
let Some(required_node_b) = self.required_node_b.as_ref() else { panic!("required node must be set!")};
if let Some(optional) = self.optional_node.as_ref() {
godot_print!("optional node has been set!");
}
}
}
Thus forcing user to abuse the .unwrap()
.
Similar case in gdscript can be represented as:
extends Node
@export var required_node_a: Node
@export var required_node_b: Node
@export var optional_node: Node
func _ready() -> void:
print(required_node_a.name) # errors if required_node_a is not present
print(required_node_b.name) # errors if required_node_b is not present
if optional_node:
print(optional_node.name)
It would be great to create abstraction similar to OnReady<Gd> for required exports. The inner workings would be similar to OnReady, while the exported property itself could be represented by simple Required<Gd<Node>>
.