use crate::{Args, Error, Il2CppClass, Il2CppValueType, Result};
use il2cpp_bridge_rs as bridge;
#[derive(Clone)]
pub struct MethodInfo {
pub(crate) inner: bridge::structs::Method,
}
impl MethodInfo {
pub fn inflate(&self, type_args: &[&Il2CppClass]) -> Result<Self> {
let classes: Vec<&bridge::structs::Class> = type_args.iter().map(|c| &c.inner).collect();
let mut inflated = self.inner.inflate(&classes).map_err(Error::Bridge)?;
inflated.instance = self.inner.instance;
Ok(Self { inner: inflated })
}
pub fn invoke<T: Il2CppValueType>(&self, args: impl Args) -> Result<T> {
let arg_ptrs = args.to_arg_ptrs();
unsafe { T::invoke_result(&self.inner, &arg_ptrs) }
}
pub fn invoke_void(&self, args: impl Args) -> Result<()> {
let arg_ptrs = args.to_arg_ptrs();
unsafe { self.inner.call::<()>(&arg_ptrs).map_err(Error::Bridge) }
}
}
unsafe impl Send for MethodInfo {}
unsafe impl Sync for MethodInfo {}