feat(nix/eval): Implement builtins.groupBy

Change-Id: I3e0aa017a7100cbeb86d2e5747471b36affcc102
Reviewed-on: https://cl.tvl.fyi/c/depot/+/7038
Autosubmit: grfn <grfn@gws.fyi>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
Griffin Smith 2022-10-18 06:32:35 -04:00 committed by clbot
parent dfa4c4847c
commit e2f0967d3f
3 changed files with 34 additions and 0 deletions

View file

@ -79,6 +79,19 @@ macro_rules! gen_cast {
};
}
/// Generate an `as_*_mut/to_*_mut` accessor method that returns either the
/// expected type, or a type error.
macro_rules! gen_cast_mut {
( $name:ident, $type:ty, $expected:expr, $variant:ident) => {
pub fn $name(&mut self) -> Result<&mut $type, ErrorKind> {
match self {
Value::$variant(x) => Ok(x),
other => Err(type_error($expected, &other)),
}
}
};
}
/// Generate an `is_*` type-checking method.
macro_rules! gen_is {
( $name:ident, $variant:pat ) => {
@ -284,6 +297,8 @@ impl Value {
gen_cast!(to_list, NixList, "list", Value::List(l), l.clone());
gen_cast!(to_closure, Closure, "lambda", Value::Closure(c), c.clone());
gen_cast_mut!(as_list_mut, NixList, "list", List);
gen_is!(is_path, Value::Path(_));
gen_is!(is_number, Value::Integer(_) | Value::Float(_));
gen_is!(is_bool, Value::Bool(_));