1use crate::eval::ParametersSpec;
19use crate::eval::ParametersSpecParam;
20use crate::typing::ParamSpec;
21use crate::typing::Ty;
22use crate::util::ArcStr;
23
24pub fn param_specs<'a, V: Copy>(
27 function_name: &str,
28 pos_only: impl IntoIterator<Item = (&'a str, ParametersSpecParam<V>, Ty)>,
29 pos_or_named: impl IntoIterator<Item = (&'a str, ParametersSpecParam<V>, Ty)>,
30 args: Option<Ty>,
31 named_only: impl IntoIterator<Item = (&'a str, ParametersSpecParam<V>, Ty)>,
32 kwargs: Option<Ty>,
33) -> crate::Result<(ParametersSpec<V>, ParamSpec)> {
34 let pos_only = Vec::from_iter(pos_only);
35 let pos_or_named = Vec::from_iter(pos_or_named);
36 let named_only = Vec::from_iter(named_only);
37
38 let parameters_spec = ParametersSpec::new_parts(
39 function_name,
40 pos_only.iter().map(|(name, param, _ty)| (*name, *param)),
41 pos_or_named
42 .iter()
43 .map(|(name, param, _ty)| (*name, *param)),
44 args.is_some(),
45 named_only.iter().map(|(name, param, _ty)| (*name, *param)),
46 kwargs.is_some(),
47 );
48
49 let param_spec = ParamSpec::new_parts(
50 pos_only
51 .into_iter()
52 .map(|(_name, param, ty)| (param.is_required(), ty)),
53 pos_or_named
54 .into_iter()
55 .map(|(name, param, ty)| (ArcStr::from(name), param.is_required(), ty)),
56 args,
57 named_only
58 .into_iter()
59 .map(|(name, param, ty)| (ArcStr::from(name), param.is_required(), ty)),
60 kwargs,
61 )?;
62
63 Ok((parameters_spec, param_spec))
64}