diff --git a/lib/types.nix b/lib/types.nix index 7276f9af9fe..b833417e73d 100644 --- a/lib/types.nix +++ b/lib/types.nix @@ -193,9 +193,9 @@ rec { nullOr = elemType: mkOptionType { name = "null or ${elemType.name}"; - check = x: builtins.isNull x || elemType.check x; + check = x: x == null || elemType.check x; merge = loc: defs: - let nrNulls = count (def: isNull def.value) defs; in + let nrNulls = count (def: def.value == null) defs; in if nrNulls == length defs then null else if nrNulls != 0 then throw "The option `${showOption loc}' is defined both null and not null, in ${showFiles (getFiles defs)}." @@ -230,11 +230,18 @@ rec { substSubModules = m: submodule m; }; - enum = values: mkOptionType { - name = "one of ${concatStringsSep ", " values}"; - check = flip elem values; - merge = mergeOneOption; - }; + enum = values: + let + show = v: + if builtins.isString v then ''"${v}"'' + else if builtins.isInt v then builtins.toString v + else ''<${builtins.typeOf v}>''; + in + mkOptionType { + name = "one of ${concatMapStringsSep ", " show values}"; + check = flip elem values; + merge = mergeOneOption; + }; either = t1: t2: mkOptionType { name = "${t1.name} or ${t2.name}";