use crate::eval::Arguments;
use crate::eval::ParametersSpec;
use crate::values::FrozenValue;
use crate::values::Heap;
use crate::values::UnpackValue;
use crate::values::Value;
use crate::values::ValueError;
#[inline]
pub fn parse_signature<'v, const N: usize>(
parser: &ParametersSpec<FrozenValue>,
args: &Arguments<'v, '_>,
heap: &'v Heap,
) -> crate::Result<[Option<Value<'v>>; N]> {
parser.collect_into(args, heap)
}
#[inline(always)]
pub fn parse_positional<'v, const R: usize, const O: usize>(
args: &Arguments<'v, '_>,
heap: &'v Heap,
) -> crate::Result<([Value<'v>; R], [Option<Value<'v>>; O])> {
args.no_named_args()?;
args.optional(heap)
}
#[inline(always)]
pub fn parse_positional_kwargs_alloc<'v, 'a, const R: usize, const O: usize>(
args: &'a Arguments<'v, 'a>,
heap: &'v Heap,
) -> crate::Result<([Value<'v>; R], [Option<Value<'v>>; O], Value<'v>)> {
let (required, optional) = args.optional(heap)?;
let kwargs = args.names_map()?;
let kwargs = heap.alloc(kwargs);
Ok((required, optional, kwargs))
}
#[inline]
pub fn check_this<'v, T: UnpackValue<'v>>(this: Value<'v>) -> anyhow::Result<T> {
T::unpack_named_param(this, "this")
}
#[inline]
pub fn check_required<'v, T: UnpackValue<'v>>(
name: &str,
x: Option<Value<'v>>,
) -> anyhow::Result<T> {
let x = x.ok_or_else(|| ValueError::MissingRequired(name.to_owned()))?;
T::unpack_named_param(x, name)
}
#[inline]
pub fn check_optional<'v, T: UnpackValue<'v>>(
name: &str,
x: Option<Value<'v>>,
) -> anyhow::Result<Option<T>> {
match x {
None => Ok(None),
Some(x) => Ok(Some(T::unpack_named_param(x, name)?)),
}
}
#[inline]
pub fn check_defaulted<'v, T: UnpackValue<'v>>(
name: &str,
x: Option<Value<'v>>,
default: impl FnOnce() -> T,
) -> anyhow::Result<T> {
Ok(check_optional(name, x)?.unwrap_or_else(default))
}
#[inline]
pub fn check_unpack<'v, T: UnpackValue<'v>>(name: &str, x: Value<'v>) -> anyhow::Result<T> {
T::unpack_named_param(x, name)
}