From 4fc67da841d1c80b8d774a7b8c8e6baf13f9496e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Romildo?= Date: Sun, 9 Jan 2022 19:12:27 -0300 Subject: [PATCH] lib.checkListOfEnum: init --- lib/default.nix | 2 +- lib/trivial.nix | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/default.nix b/lib/default.nix index fe5d2db0db8f..2dfe62e82a8b 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -66,7 +66,7 @@ let stringLength sub substring tail trace; inherit (self.trivial) id const pipe concat or and bitAnd bitOr bitXor bitNot boolToString mergeAttrs flip mapNullable inNixShell isFloat min max - importJSON importTOML warn warnIf throwIfNot + importJSON importTOML warn warnIf throwIfNot checkListOfEnum info showWarnings nixpkgsVersion version mod compare splitByAndCompare functionArgs setFunctionArgs isFunction toHexString toBaseDigits; diff --git a/lib/trivial.nix b/lib/trivial.nix index c961d3aa7301..575aaf6a7ad4 100644 --- a/lib/trivial.nix +++ b/lib/trivial.nix @@ -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;