diff options
Diffstat (limited to 'lib/trivial.nix')
-rw-r--r-- | lib/trivial.nix | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/lib/trivial.nix b/lib/trivial.nix index c961d3aa73019..c68bac902e913 100644 --- a/lib/trivial.nix +++ b/lib/trivial.nix @@ -61,11 +61,11 @@ rec { pipe = val: functions: let reverseApply = x: f: f x; in builtins.foldl' reverseApply val functions; - /* note please don’t add a function like `compose = flip pipe`. - This would confuse users, because the order of the functions - in the list is not clear. With pipe, it’s obvious that it - goes first-to-last. With `compose`, not so much. - */ + + # note please don’t add a function like `compose = flip pipe`. + # This would confuse users, because the order of the functions + # in the list is not clear. With pipe, it’s obvious that it + # goes first-to-last. With `compose`, not so much. ## Named versions corresponding to some builtin operators. @@ -347,6 +347,23 @@ rec { */ throwIfNot = cond: msg: if cond then x: x else throw msg; + /* Check if the elements in a list are valid values from a enum, returning the identity function, or throwing an error message otherwise. + + Example: + let colorVariants = ["bright" "dark" "black"] + in checkListOfEnum "color variants" [ "standard" "light" "dark" ] colorVariants; + => + error: color variants: bright, black unexpected; valid ones: standard, light, dark + + Type: String -> List ComparableVal -> List ComparableVal -> a -> a + */ + checkListOfEnum = msg: valid: given: + let + unexpected = lib.subtractLists valid given; + in + lib.throwIfNot (unexpected == []) + "${msg}: ${builtins.concatStringsSep ", " (builtins.map builtins.toString unexpected)} unexpected; valid ones: ${builtins.concatStringsSep ", " (builtins.map builtins.toString valid)}"; + info = msg: builtins.trace "INFO: ${msg}"; showWarnings = warnings: res: lib.foldr (w: x: warn w x) res warnings; |