lib/types: Handle submodules for type "either"

So far the "either" type only handled "flat" types, so you couldn't do
something like:

type = either int (submodule {
  options = ...;
});

Not only caused this the submodule's options not being checked but also
not show up in the documentation.

This was something we stumbled on with #13916.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Cc: @edolstra
This commit is contained in:
aszlig 2016-03-19 17:22:39 +01:00
parent 3c060b93b6
commit 0f0805b51a
No known key found for this signature in database
GPG Key ID: D0EBD0EC8C2DC961

View File

@ -246,7 +246,25 @@ rec {
either = t1: t2: mkOptionType {
name = "${t1.name} or ${t2.name}";
check = x: t1.check x || t2.check x;
merge = mergeOneOption;
merge = loc: defs:
if all t1.check (getValues defs) then t1.merge loc defs
else if all t2.check (getValues defs) then t2.merge loc defs
else throw ( "The option `${showOption loc}' has conflicting"
+ " definitions for type either, in"
+ " ${showFiles (getFiles defs)}.");
getSubOptions = prefix: t1.getSubOptions prefix
// t2.getSubOptions prefix;
getSubModules = concatLists (remove null [
t1.getSubModules
t2.getSubModules
]);
substSubModules = m: let
maybeDef = def: r: if r == null then def else r;
in either (maybeDef t1 (t1.substSubModules m))
(maybeDef t2 (t2.substSubModules m));
};
# Obsolete alternative to configOf. It takes its option