use crate::builtin::Variant;
use crate::r#gen::classes::Node;
use crate::meta::error::RpcError;
use crate::obj::{Gd, GodotClass, Inherits, WithBaseField};
#[doc(hidden)]
pub enum UserRpcObject<'c, C: GodotClass> {
Internal(&'c mut C),
External(Gd<C>),
}
impl<'c, C> UserRpcObject<'c, C>
where
C: WithBaseField + Inherits<Node>,
{
pub fn call_rpc(self, name: &str, args: &[Variant]) -> Result<(), RpcError> {
let error = match self {
UserRpcObject::Internal(self_mut) => {
let mut node = self_mut.to_gd().upcast::<Node>();
let _reentrant_guard = self_mut.base_mut();
node.rpc(name, args)
}
UserRpcObject::External(mut gd) => gd.upcast_mut::<Node>().rpc(name, args),
};
match error.try_into() {
Ok(error) => Err(error),
Err(_) => Ok(()),
}
}
pub fn call_rpc_id(self, name: &str, id: i64, args: &[Variant]) -> Result<(), RpcError> {
let error = match self {
UserRpcObject::Internal(self_mut) => {
let mut node = self_mut.to_gd().upcast::<Node>();
let _reentrant_guard = self_mut.base_mut();
node.rpc_id(id, name, args)
}
UserRpcObject::External(mut gd) => gd.upcast_mut::<Node>().rpc_id(id, name, args),
};
match error.try_into() {
Ok(error) => Err(error),
Err(_) => Ok(()),
}
}
}