godot-bevy 0.1.0

Bridge between Bevy ECS and Godot 4 for Rust-powered game development
Documentation
use bevy::ecs::resource::Resource as BevyResource;
use godot::{
    classes::{Resource, class_macros::sys},
    obj::{Gd, InstanceId},
};

use super::utils::{maybe_dec_ref, maybe_inc_ref, maybe_inc_ref_opt};

#[derive(Debug, BevyResource)]
pub struct GodotResourceRef {
    resource_id: InstanceId,
}

impl GodotResourceRef {
    pub fn get(&mut self) -> Gd<Resource> {
        self.try_get().unwrap()
    }

    pub fn try_get(&mut self) -> Option<Gd<Resource>> {
        Gd::try_from_instance_id(self.resource_id).ok()
    }

    pub fn new(mut reference: Gd<Resource>) -> Self {
        maybe_inc_ref(&mut reference);

        Self {
            resource_id: reference.instance_id(),
        }
    }
}

impl Clone for GodotResourceRef {
    fn clone(&self) -> Self {
        maybe_inc_ref_opt::<Resource>(&mut Gd::try_from_instance_id(self.resource_id).ok());

        Self {
            resource_id: self.resource_id.clone(),
        }
    }
}

impl Drop for GodotResourceRef {
    fn drop(&mut self) {
        let mut gd = self.get();
        let is_last = maybe_dec_ref(&mut gd); // may drop
        if is_last {
            unsafe {
                sys::interface_fn!(object_destroy)(gd.obj_sys());
            }
        }
    }
}