Skip to content

Commit

Permalink
lib: move assertMsg and assertOneOf to their own library file
Browse files Browse the repository at this point in the history
Since the `assertOneOf` uses `lib.generators`, they are not really trivial
anymore and should go into their own library file.
  • Loading branch information
Profpatsch committed Aug 14, 2018
1 parent 5582a69 commit eca136a
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 46 deletions.
44 changes: 44 additions & 0 deletions lib/asserts.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{ 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}";

}
9 changes: 5 additions & 4 deletions lib/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,11 @@ let
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;

Expand All @@ -59,9 +60,7 @@ let
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
Expand Down Expand Up @@ -118,6 +117,8 @@ let
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
Expand Down
4 changes: 2 additions & 2 deletions lib/lists.nix
Original file line number Diff line number Diff line change
Expand Up @@ -509,7 +509,7 @@ rec {
=> 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
Expand All @@ -519,7 +519,7 @@ rec {
=> [ 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;


Expand Down
40 changes: 1 addition & 39 deletions lib/trivial.nix
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ rec {
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
Expand All @@ -188,44 +188,6 @@ rec {
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

Expand Down
2 changes: 1 addition & 1 deletion lib/types.nix
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,7 @@ rec {
# 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 {
Expand Down

0 comments on commit eca136a

Please sign in to comment.