lib: move assertMsg and assertOneOf to their own library file

Since the `assertOneOf` uses `lib.generators`, they are not really trivial
anymore and should go into their own library file.

+44
lib/asserts.nix
···
+
{ lib }:
+
+
rec {
+
+
/* Print a trace message if pred is false.
+
Intended to be used to augment asserts with helpful error messages.
+
+
Example:
+
assertMsg false "nope"
+
=> false
+
stderr> trace: nope
+
+
assert (assertMsg ("foo" == "bar") "foo is not bar, silly"); ""
+
stderr> trace: foo is not bar, silly
+
stderr> assert failed at …
+
+
Type:
+
assertMsg :: Bool -> String -> Bool
+
*/
+
# TODO(Profpatsch): add tests that check stderr
+
assertMsg = pred: msg:
+
if pred
+
then true
+
else builtins.trace msg false;
+
+
/* Specialized `assertMsg` for checking if val is one of the elements
+
of a list. Useful for checking enums.
+
+
Example:
+
let sslLibrary = "libressl"
+
in assertOneOf "sslLibrary" sslLibrary [ "openssl" "bearssl" ]
+
=> false
+
stderr> trace: sslLibrary must be one of "openssl", "bearssl", but is: "libressl"
+
+
Type:
+
assertOneOf :: String -> ComparableVal -> List ComparableVal -> Bool
+
*/
+
assertOneOf = name: val: xs: assertMsg
+
(lib.elem val xs)
+
"${name} must be one of ${
+
lib.generators.toPretty {} xs}, but is: ${
+
lib.generators.toPretty {} val}";
+
+
}
+5 -4
lib/default.nix
···
systems = callLibs ./systems;
# misc
+
asserts = callLibs ./asserts.nix;
debug = callLibs ./debug.nix;
-
generators = callLibs ./generators.nix;
misc = callLibs ./deprecated.nix;
+
# domain-specific
fetchers = callLibs ./fetchers.nix;
···
inherit (trivial) id const concat or and bitAnd bitOr bitXor bitNot
boolToString mergeAttrs flip mapNullable inNixShell min max
importJSON warn info nixpkgsVersion version mod compare
-
splitByAndCompare functionArgs setFunctionArgs isFunction
-
assertMsg assertOneOf;
-
+
splitByAndCompare functionArgs setFunctionArgs isFunction;
inherit (fixedPoints) fix fix' extends composeExtensions
makeExtensible makeExtensibleWithCustomName;
inherit (attrsets) attrByPath hasAttrByPath setAttrByPath
···
unknownModule mkOption;
inherit (types) isType setType defaultTypeMerge defaultFunctor
isOptionType mkOptionType;
+
inherit (asserts)
+
assertMsg assertOneOf;
inherit (debug) addErrorContextToAttrs traceIf traceVal traceValFn
traceXMLVal traceXMLValMarked traceSeq traceSeqN traceValSeq
traceValSeqFn traceValSeqN traceValSeqNFn traceShowVal
+2 -2
lib/lists.nix
···
=> 3
*/
last = list:
-
assert assertMsg (list != []) "lists.last: list must not be empty!";
+
assert lib.assertMsg (list != []) "lists.last: list must not be empty!";
elemAt list (length list - 1);
/* Return all elements but the last
···
=> [ 1 2 ]
*/
init = list:
-
assert assertMsg (list != []) "lists.init: list must not be empty!";
+
assert lib.assertMsg (list != []) "lists.init: list must not be empty!";
take (length list - 1) list;
+1 -39
lib/trivial.nix
···
builtins.fromJSON (builtins.readFile path);
-
## Warnings and asserts
+
## Warnings
/* See https://github.com/NixOS/nix/issues/749. Eventually we'd like these
to expand to Nix builtins that carry metadata so that Nix can filter out
···
warn = msg: builtins.trace "WARNING: ${msg}";
info = msg: builtins.trace "INFO: ${msg}";
-
/* Print a trace message if pred is false.
-
Intended to be used to augment asserts with helpful error messages.
-
-
Example:
-
assertMsg false "nope"
-
=> false
-
stderr> trace: nope
-
-
assert (assertMsg ("foo" == "bar") "foo is not bar, silly"); ""
-
stderr> trace: foo is not bar, silly
-
stderr> assert failed at …
-
-
Type:
-
assertMsg :: Bool -> String -> Bool
-
*/
-
# TODO(Profpatsch): add tests that check stderr
-
assertMsg = pred: msg:
-
if pred
-
then true
-
else builtins.trace msg false;
-
-
/* Specialized `assertMsg` for checking if val is one of the elements
-
of a list. Useful for checking enums.
-
-
Example:
-
let sslLibrary = "libressl"
-
in assertOneOf "sslLibrary" sslLibrary [ "openssl" "bearssl" ]
-
=> false
-
stderr> trace: sslLibrary must be one of "openssl", "bearssl", but is: "libressl"
-
-
Type:
-
assertOneOf :: String -> ComparableVal -> List ComparableVal -> Bool
-
*/
-
assertOneOf = name: val: xs: assertMsg
-
(lib.elem val xs)
-
"${name} must be one of ${
-
lib.generators.toPretty {} xs}, but is: ${
-
lib.generators.toPretty {} val}";
## Function annotations
+1 -1
lib/types.nix
···
# Either value of type `finalType` or `coercedType`, the latter is
# converted to `finalType` using `coerceFunc`.
coercedTo = coercedType: coerceFunc: finalType:
-
assert assertMsg (coercedType.getSubModules == null)
+
assert lib.assertMsg (coercedType.getSubModules == null)
"coercedTo: coercedType must not have submodules (it’s a ${
coercedType.description})";
mkOptionType rec {