From f2c5c706f47024fd477655fc34e883ce15172484 Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Wed, 22 Dec 2021 13:05:55 +0100 Subject: lib.throwIfNot: init --- lib/default.nix | 3 ++- lib/trivial.nix | 22 ++++++++++++++++++++++ pkgs/top-level/default.nix | 2 +- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/lib/default.nix b/lib/default.nix index 626a751cb10..fe5d2db0db8 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -66,7 +66,8 @@ 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 info showWarnings nixpkgsVersion version + importJSON importTOML warn warnIf throwIfNot + info showWarnings nixpkgsVersion version mod compare splitByAndCompare functionArgs setFunctionArgs isFunction toHexString toBaseDigits; inherit (self.fixedPoints) fix fix' converge extends composeExtensions diff --git a/lib/trivial.nix b/lib/trivial.nix index 33b553ac419..c961d3aa730 100644 --- a/lib/trivial.nix +++ b/lib/trivial.nix @@ -325,6 +325,28 @@ rec { */ warnIf = cond: msg: if cond then warn msg else id; + /* + Like the `assert b; e` expression, but with a custom error message and + without the semicolon. + + If true, return the identity function, `r: r`. + + If false, throw the error message. + + Calls can be juxtaposed using function application, as `(r: r) a = a`, so + `(r: r) (r: r) a = a`, and so forth. + + Type: bool -> string -> a -> a + + Example: + + throwIfNot (lib.isList overlays) "The overlays argument to nixpkgs must be a list." + lib.foldr (x: throwIfNot (lib.isFunction x) "All overlays passed to nixpkgs must be functions.") (r: r) overlays + pkgs + + */ + throwIfNot = cond: msg: if cond then x: x else throw msg; + info = msg: builtins.trace "INFO: ${msg}"; showWarnings = warnings: res: lib.foldr (w: x: warn w x) res warnings; diff --git a/pkgs/top-level/default.nix b/pkgs/top-level/default.nix index 10d0c79b212..e95a0db78c3 100644 --- a/pkgs/top-level/default.nix +++ b/pkgs/top-level/default.nix @@ -49,7 +49,7 @@ let # Rename the function arguments in let lib = import ../../lib; - throwIfNot = b: msg: if b then x: x else throw msg; + inherit (lib) throwIfNot; checked = throwIfNot (lib.isList overlays) "The overlays argument to nixpkgs must be a list." -- cgit 1.4.1