diff options
author | Silvan Mosberger <silvan.mosberger@tweag.io> | 2023-12-07 22:08:00 +0100 |
---|---|---|
committer | Silvan Mosberger <silvan.mosberger@tweag.io> | 2023-12-08 21:50:29 +0100 |
commit | 8d3978c149352de6b7e8b72946b58a16427eda2c (patch) | |
tree | 42ab5a871dcfc8a995afb3d9bcf8fd9323c1b3ff | |
parent | 6cb8f045bf95959cde8845ac3bd24a9ef21b3333 (diff) |
lib.types.boolByOr: init
This type is necessary to have correct merging behavior for `allowUnfreePredicate` and `allowInsecurePredicate` Co-authored-by: Robert Hensing <roberth@users.noreply.github.com>
-rwxr-xr-x | lib/tests/modules.sh | 6 | ||||
-rw-r--r-- | lib/tests/modules/boolByOr.nix | 14 | ||||
-rw-r--r-- | lib/types.nix | 16 | ||||
-rw-r--r-- | nixos/doc/manual/development/option-types.section.md | 7 |
4 files changed, 43 insertions, 0 deletions
diff --git a/lib/tests/modules.sh b/lib/tests/modules.sh index 21d4978a11609..0eb976c1f4978 100755 --- a/lib/tests/modules.sh +++ b/lib/tests/modules.sh @@ -111,6 +111,12 @@ checkConfigError 'The option .* does not exist. Definition values:\n\s*- In .*' checkConfigError 'while evaluating a definition from `.*/define-enable-abort.nix' config.enable ./define-enable-abort.nix checkConfigError 'while evaluating the error message for definitions for .enable., which is an option that does not exist' config.enable ./define-enable-abort.nix +# Check boolByOr type. +checkConfigOutput '^false$' config.value.falseFalse ./boolByOr.nix +checkConfigOutput '^true$' config.value.trueFalse ./boolByOr.nix +checkConfigOutput '^true$' config.value.falseTrue ./boolByOr.nix +checkConfigOutput '^true$' config.value.trueTrue ./boolByOr.nix + checkConfigOutput '^1$' config.bare-submodule.nested ./declare-bare-submodule.nix ./declare-bare-submodule-nested-option.nix checkConfigOutput '^2$' config.bare-submodule.deep ./declare-bare-submodule.nix ./declare-bare-submodule-deep-option.nix checkConfigOutput '^42$' config.bare-submodule.nested ./declare-bare-submodule.nix ./declare-bare-submodule-nested-option.nix ./declare-bare-submodule-deep-option.nix ./define-bare-submodule-values.nix diff --git a/lib/tests/modules/boolByOr.nix b/lib/tests/modules/boolByOr.nix new file mode 100644 index 0000000000000..ff86e2dfc8599 --- /dev/null +++ b/lib/tests/modules/boolByOr.nix @@ -0,0 +1,14 @@ +{ lib, ... }: { + + options.value = lib.mkOption { + type = lib.types.lazyAttrsOf lib.types.boolByOr; + }; + + config.value = { + falseFalse = lib.mkMerge [ false false ]; + trueFalse = lib.mkMerge [ true false ]; + falseTrue = lib.mkMerge [ false true ]; + trueTrue = lib.mkMerge [ true true ]; + }; +} + diff --git a/lib/types.nix b/lib/types.nix index 5ffbecda5db39..51e58eaa8ab51 100644 --- a/lib/types.nix +++ b/lib/types.nix @@ -275,6 +275,22 @@ rec { merge = mergeEqualOption; }; + boolByOr = mkOptionType { + name = "boolByOr"; + description = "boolean (merged using or)"; + descriptionClass = "noun"; + check = isBool; + merge = loc: defs: + foldl' + (result: def: + # Under the assumption that .check always runs before merge, we can assume that all defs.*.value + # have been forced, and therefore we assume we don't introduce order-dependent strictness here + result || def.value + ) + false + defs; + }; + int = mkOptionType { name = "int"; description = "signed integer"; diff --git a/nixos/doc/manual/development/option-types.section.md b/nixos/doc/manual/development/option-types.section.md index 2ad3d6c4f9495..f9c7ac80018e4 100644 --- a/nixos/doc/manual/development/option-types.section.md +++ b/nixos/doc/manual/development/option-types.section.md @@ -13,6 +13,13 @@ merging is handled. `types.bool` : A boolean, its values can be `true` or `false`. + All definitions must have the same value, after priorities. An error is thrown in case of a conflict. + +`types.boolByOr` + +: A boolean, its values can be `true` or `false`. + The result is `true` if _any_ of multiple definitions is `true`. + In other words, definitions are merged with the logical _OR_ operator. `types.path` |