summary refs log tree commit diff
path: root/lib/types.nix
diff options
context:
space:
mode:
authorSilvan Mosberger <contact@infinisil.com>2022-09-09 19:59:29 +0200
committerGitHub <noreply@github.com>2022-09-09 19:59:29 +0200
commit6389a26e5f9c90ca1fd70a8e9f778b0f58d19378 (patch)
tree6b43df340849dea2cb7d13358aef49bacc453bfb /lib/types.nix
parent8f29134fcf6bcf3fae20c1d132a9e8c36eeeb7e9 (diff)
parent52bbbaeb09859b02561a1895f0516e094b2f9d67 (diff)
Merge pull request #181834 from ncfavier/numbers
lib/types: add `number`
Diffstat (limited to 'lib/types.nix')
-rw-r--r--lib/types.nix42
1 files changed, 33 insertions, 9 deletions
diff --git a/lib/types.nix b/lib/types.nix
index d7655bc1a6a2f..f235e3419926b 100644
--- a/lib/types.nix
+++ b/lib/types.nix
@@ -227,11 +227,11 @@ rec {
     };
 
     int = mkOptionType {
-        name = "int";
-        description = "signed integer";
-        check = isInt;
-        merge = mergeEqualOption;
-      };
+      name = "int";
+      description = "signed integer";
+      check = isInt;
+      merge = mergeEqualOption;
+    };
 
     # Specialized subdomains of int
     ints =
@@ -292,10 +292,34 @@ rec {
     port = ints.u16;
 
     float = mkOptionType {
-        name = "float";
-        description = "floating point number";
-        check = isFloat;
-        merge = mergeEqualOption;
+      name = "float";
+      description = "floating point number";
+      check = isFloat;
+      merge = mergeEqualOption;
+    };
+
+    number = either int float;
+
+    numbers = let
+      betweenDesc = lowest: highest:
+        "${builtins.toJSON lowest} and ${builtins.toJSON highest} (both inclusive)";
+    in {
+      between = lowest: highest:
+        assert lib.assertMsg (lowest <= highest)
+          "numbers.between: lowest must be smaller than highest";
+        addCheck number (x: x >= lowest && x <= highest) // {
+          name = "numberBetween";
+          description = "integer or floating point number between ${betweenDesc lowest highest}";
+        };
+
+      nonnegative = addCheck number (x: x >= 0) // {
+        name = "numberNonnegative";
+        description = "nonnegative integer or floating point number, meaning >=0";
+      };
+      positive = addCheck number (x: x > 0) // {
+        name = "numberPositive";
+        description = "positive integer or floating point number, meaning >0";
+      };
     };
 
     str = mkOptionType {