use crate::typing::ParamSpec;
use crate::values::type_repr::StarlarkTypeRepr;
pub trait StarlarkCallableParamSpec {
fn params() -> ParamSpec;
}
pub struct StarlarkCallableParamAny;
impl StarlarkCallableParamSpec for StarlarkCallableParamAny {
fn params() -> ParamSpec {
ParamSpec::any()
}
}
impl StarlarkCallableParamSpec for () {
fn params() -> ParamSpec {
ParamSpec::pos_only([], [])
}
}
impl<A: StarlarkTypeRepr> StarlarkCallableParamSpec for (A,) {
fn params() -> ParamSpec {
ParamSpec::pos_only([A::starlark_type_repr()], [])
}
}
impl<A: StarlarkTypeRepr, B: StarlarkTypeRepr> StarlarkCallableParamSpec for (A, B) {
fn params() -> ParamSpec {
ParamSpec::pos_only([A::starlark_type_repr(), B::starlark_type_repr()], [])
}
}
impl<A: StarlarkTypeRepr, B: StarlarkTypeRepr, C: StarlarkTypeRepr> StarlarkCallableParamSpec
for (A, B, C)
{
fn params() -> ParamSpec {
ParamSpec::pos_only(
[
A::starlark_type_repr(),
B::starlark_type_repr(),
C::starlark_type_repr(),
],
[],
)
}
}
impl<A: StarlarkTypeRepr, B: StarlarkTypeRepr, C: StarlarkTypeRepr, D: StarlarkTypeRepr>
StarlarkCallableParamSpec for (A, B, C, D)
{
fn params() -> ParamSpec {
ParamSpec::pos_only(
[
A::starlark_type_repr(),
B::starlark_type_repr(),
C::starlark_type_repr(),
D::starlark_type_repr(),
],
[],
)
}
}