Merge pull request #65728 from Infinisil/types-eithers
lib/types: Add oneOf, extension of either to a list of types
This commit is contained in:
commit
6f6468bef3
|
@ -71,6 +71,15 @@ checkConfigError 'The option value .* in .* is not of type.*positive integer.*'
|
||||||
checkConfigOutput "42" config.value ./declare-int-between-value.nix ./define-value-int-positive.nix
|
checkConfigOutput "42" config.value ./declare-int-between-value.nix ./define-value-int-positive.nix
|
||||||
checkConfigError 'The option value .* in .* is not of type.*between.*-21 and 43.*inclusive.*' config.value ./declare-int-between-value.nix ./define-value-int-negative.nix
|
checkConfigError 'The option value .* in .* is not of type.*between.*-21 and 43.*inclusive.*' config.value ./declare-int-between-value.nix ./define-value-int-negative.nix
|
||||||
|
|
||||||
|
# Check either types
|
||||||
|
# types.either
|
||||||
|
checkConfigOutput "42" config.value ./declare-either.nix ./define-value-int-positive.nix
|
||||||
|
checkConfigOutput "\"24\"" config.value ./declare-either.nix ./define-value-string.nix
|
||||||
|
# types.oneOf
|
||||||
|
checkConfigOutput "42" config.value ./declare-oneOf.nix ./define-value-int-positive.nix
|
||||||
|
checkConfigOutput "[ ]" config.value ./declare-oneOf.nix ./define-value-list.nix
|
||||||
|
checkConfigOutput "\"24\"" config.value ./declare-oneOf.nix ./define-value-string.nix
|
||||||
|
|
||||||
# Check mkForce without submodules.
|
# Check mkForce without submodules.
|
||||||
set -- config.enable ./declare-enable.nix ./define-enable.nix
|
set -- config.enable ./declare-enable.nix ./define-enable.nix
|
||||||
checkConfigOutput "true" "$@"
|
checkConfigOutput "true" "$@"
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
{ lib, ... }: {
|
||||||
|
options.value = lib.mkOption {
|
||||||
|
type = lib.types.either lib.types.int lib.types.str;
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
{ lib, ... }: {
|
||||||
|
options.value = lib.mkOption {
|
||||||
|
type = lib.types.oneOf [
|
||||||
|
lib.types.int
|
||||||
|
(lib.types.listOf lib.types.int)
|
||||||
|
lib.types.str
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
|
@ -443,6 +443,13 @@ rec {
|
||||||
functor = (defaultFunctor name) // { wrapped = [ t1 t2 ]; };
|
functor = (defaultFunctor name) // { wrapped = [ t1 t2 ]; };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Any of the types in the given list
|
||||||
|
oneOf = ts:
|
||||||
|
let
|
||||||
|
head' = if ts == [] then throw "types.oneOf needs to get at least one type in its argument" else head ts;
|
||||||
|
tail' = tail ts;
|
||||||
|
in foldl' either head' tail';
|
||||||
|
|
||||||
# Either value of type `finalType` or `coercedType`, the latter is
|
# Either value of type `finalType` or `coercedType`, the latter is
|
||||||
# converted to `finalType` using `coerceFunc`.
|
# converted to `finalType` using `coerceFunc`.
|
||||||
coercedTo = coercedType: coerceFunc: finalType:
|
coercedTo = coercedType: coerceFunc: finalType:
|
||||||
|
|
|
@ -346,6 +346,18 @@
|
||||||
</para>
|
</para>
|
||||||
</listitem>
|
</listitem>
|
||||||
</varlistentry>
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>
|
||||||
|
<varname>types.oneOf</varname> [ <replaceable>t1</replaceable> <replaceable>t2</replaceable> ... ]
|
||||||
|
</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Type <replaceable>t1</replaceable> or type <replaceable>t2</replaceable> and so forth,
|
||||||
|
e.g. <literal>with types; oneOf [ int str bool ]</literal>. Multiple definitions
|
||||||
|
cannot be merged.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
<varlistentry>
|
<varlistentry>
|
||||||
<term>
|
<term>
|
||||||
<varname>types.coercedTo</varname> <replaceable>from</replaceable> <replaceable>f</replaceable> <replaceable>to</replaceable>
|
<varname>types.coercedTo</varname> <replaceable>from</replaceable> <replaceable>f</replaceable> <replaceable>to</replaceable>
|
||||||
|
|
|
@ -41,7 +41,7 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkOption {
|
config = mkOption {
|
||||||
type = with types; attrsOf (either (either str (either int bool)) (listOf str));
|
type = with types; attrsOf (oneOf [ str int bool (listOf str) ]);
|
||||||
default = {};
|
default = {};
|
||||||
description = ''
|
description = ''
|
||||||
automysqlbackup configuration. Refer to
|
automysqlbackup configuration. Refer to
|
||||||
|
|
|
@ -118,7 +118,7 @@ in {
|
||||||
};
|
};
|
||||||
|
|
||||||
serverProperties = mkOption {
|
serverProperties = mkOption {
|
||||||
type = with types; attrsOf (either bool (either int str));
|
type = with types; attrsOf (oneOf [ bool int str ]);
|
||||||
default = {};
|
default = {};
|
||||||
example = literalExample ''
|
example = literalExample ''
|
||||||
{
|
{
|
||||||
|
|
|
@ -7,7 +7,7 @@ let
|
||||||
cfg = config.services.davmail;
|
cfg = config.services.davmail;
|
||||||
|
|
||||||
configType = with types;
|
configType = with types;
|
||||||
either (either (attrsOf configType) str) (either int bool) // {
|
oneOf [ (attrsOf configType) str int bool ] // {
|
||||||
description = "davmail config type (str, int, bool or attribute set thereof)";
|
description = "davmail config type (str, int, bool or attribute set thereof)";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -447,7 +447,7 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkOption {
|
config = mkOption {
|
||||||
type = with types; attrsOf (either bool (either str (listOf str)));
|
type = with types; attrsOf (oneOf [ bool str (listOf str) ]);
|
||||||
description = ''
|
description = ''
|
||||||
The main.cf configuration file as key value set.
|
The main.cf configuration file as key value set.
|
||||||
'';
|
'';
|
||||||
|
|
|
@ -331,7 +331,7 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkOption {
|
config = mkOption {
|
||||||
type = with types; attrsOf (either bool (either str (listOf str)));
|
type = with types; attrsOf (oneOf [ bool str (listOf str) ]);
|
||||||
description = ''
|
description = ''
|
||||||
Addon to postfix configuration
|
Addon to postfix configuration
|
||||||
'';
|
'';
|
||||||
|
|
|
@ -30,7 +30,7 @@ in {
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkOption {
|
config = mkOption {
|
||||||
type = with types; attrsOf (either str (either int bool));
|
type = with types; attrsOf (oneOf [ str int bool ]);
|
||||||
default = {};
|
default = {};
|
||||||
description = ''
|
description = ''
|
||||||
The configuration to give rss2email.
|
The configuration to give rss2email.
|
||||||
|
|
|
@ -62,9 +62,9 @@ let
|
||||||
concatStringsSep "\n" (toLines cfg.config);
|
concatStringsSep "\n" (toLines cfg.config);
|
||||||
|
|
||||||
semanticTypes = with types; rec {
|
semanticTypes = with types; rec {
|
||||||
zncAtom = nullOr (either (either int bool) str);
|
zncAtom = nullOr (oneOf [ int bool str ]);
|
||||||
zncAttr = attrsOf (nullOr zncConf);
|
zncAttr = attrsOf (nullOr zncConf);
|
||||||
zncAll = either (either zncAtom (listOf zncAtom)) zncAttr;
|
zncAll = oneOf [ zncAtom (listOf zncAtom) zncAttr ];
|
||||||
zncConf = attrsOf (zncAll // {
|
zncConf = attrsOf (zncAll // {
|
||||||
# Since this is a recursive type and the description by default contains
|
# Since this is a recursive type and the description by default contains
|
||||||
# the description of its subtypes, infinite recursion would occur without
|
# the description of its subtypes, infinite recursion would occur without
|
||||||
|
|
|
@ -36,7 +36,7 @@ in {
|
||||||
};
|
};
|
||||||
|
|
||||||
config = mkOption {
|
config = mkOption {
|
||||||
type = attrsOf (nullOr (either (either bool int) str));
|
type = attrsOf (nullOr (oneOf [ bool int str ]));
|
||||||
default = {};
|
default = {};
|
||||||
example = literalExample ''
|
example = literalExample ''
|
||||||
{
|
{
|
||||||
|
|
|
@ -14,7 +14,7 @@ let
|
||||||
|
|
||||||
pkg = pkgs.limesurvey;
|
pkg = pkgs.limesurvey;
|
||||||
|
|
||||||
configType = with types; either (either (attrsOf configType) str) (either int bool) // {
|
configType = with types; oneOf [ (attrsOf configType) str int bool ] // {
|
||||||
description = "limesurvey config type (str, int, bool or attribute set thereof)";
|
description = "limesurvey config type (str, int, bool or attribute set thereof)";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -215,7 +215,7 @@ in {
|
||||||
};
|
};
|
||||||
|
|
||||||
settings = let
|
settings = let
|
||||||
configTypes = with types; either bool (either int (either float str));
|
configTypes = with types; oneOf [ bool int float str ];
|
||||||
# types.loaOf converts lists to sets
|
# types.loaOf converts lists to sets
|
||||||
loaOf = t: with types; either (listOf t) (attrsOf t);
|
loaOf = t: with types; either (listOf t) (attrsOf t);
|
||||||
in mkOption {
|
in mkOption {
|
||||||
|
|
|
@ -226,7 +226,7 @@ in rec {
|
||||||
|
|
||||||
environment = mkOption {
|
environment = mkOption {
|
||||||
default = {};
|
default = {};
|
||||||
type = with types; attrsOf (nullOr (either str (either path package)));
|
type = with types; attrsOf (nullOr (oneOf [ str path package ]));
|
||||||
example = { PATH = "/foo/bar/bin"; LANG = "nl_NL.UTF-8"; };
|
example = { PATH = "/foo/bar/bin"; LANG = "nl_NL.UTF-8"; };
|
||||||
description = "Environment variables passed to the service's processes.";
|
description = "Environment variables passed to the service's processes.";
|
||||||
};
|
};
|
||||||
|
|
|
@ -520,7 +520,7 @@ in
|
||||||
};
|
};
|
||||||
|
|
||||||
systemd.globalEnvironment = mkOption {
|
systemd.globalEnvironment = mkOption {
|
||||||
type = with types; attrsOf (nullOr (either str (either path package)));
|
type = with types; attrsOf (nullOr (oneOf [ str path package ]));
|
||||||
default = {};
|
default = {};
|
||||||
example = { TZ = "CET"; };
|
example = { TZ = "CET"; };
|
||||||
description = ''
|
description = ''
|
||||||
|
|
Loading…
Reference in New Issue