use godot_ffi as sys;
use crate::builtin::Variant;
use crate::meta::CallContext;
use crate::meta::error::CallResult;
use crate::registry::info::PropertyInfo;
mod impls;
pub trait ParamTuple: Sized {
const LEN: usize;
#[doc(hidden)]
fn param_info(
index: usize,
param_name: &str,
) -> Option<crate::registry::method::MethodParamOrReturnInfo>;
fn property_info(index: usize, param_name: &str) -> Option<PropertyInfo> {
Self::param_info(index, param_name).map(|param| param.info)
}
fn format_args(&self) -> String;
}
pub trait InParamTuple: ParamTuple {
#[doc(hidden)]
unsafe fn from_varcall_args(
args_ptr: *const sys::GDExtensionConstVariantPtr,
arg_count: usize,
default_values: &[Variant],
call_ctx: &CallContext,
) -> CallResult<Self>;
#[doc(hidden)] unsafe fn from_ptrcall_args(
args_ptr: *const sys::GDExtensionConstTypePtr,
call_type: sys::PtrcallType,
call_ctx: &CallContext,
) -> CallResult<Self>;
fn from_variant_array(array: &[&Variant]) -> Self;
}
pub trait OutParamTuple: ParamTuple {
fn with_variants<F, R>(self, f: F) -> R
where
F: FnOnce(&[Variant]) -> R;
#[doc(hidden)] fn with_variant_pointers<F, R>(self, f: F) -> R
where
F: FnOnce(&[sys::GDExtensionConstVariantPtr]) -> R;
#[doc(hidden)] fn with_type_pointers<F, R>(self, f: F) -> R
where
F: FnOnce(&[sys::GDExtensionConstTypePtr]) -> R;
fn to_variant_array(&self) -> Vec<Variant>;
}
#[doc(hidden)]
pub trait TupleFromGodot: Sized {}