lib/types: allow custom submoduleWith descriptions

Currently the only way to set the description for a submodule type is to
use `freeformType`. This is not ideal as it requires setting a
freeform type, and evaluates the submodule config unnecessarily.

Instead, add a `description` argument to `submoduleWith`.
This commit is contained in:
Naïm Favier 2022-05-19 15:15:08 +02:00
parent ddfb78791c
commit ceebdcfc2c
No known key found for this signature in database
GPG key ID: 49B07322580B7EE2

View file

@ -568,6 +568,7 @@ rec {
{ modules
, specialArgs ? {}
, shorthandOnlyDefinesConfig ? false
, description ? null
# Internal variable to avoid `_key` collisions regardless
# of `extendModules`. Wired through by `evalModules`.
@ -616,10 +617,14 @@ rec {
freeformType = base._module.freeformType;
in
mkOptionType rec {
name = "submodule";
description = freeformType.description or name;
in
mkOptionType {
inherit name;
description =
if description != null then description
else freeformType.description or name;
check = x: isAttrs x || isFunction x || path.check x;
merge = loc: defs:
(base.extendModules {
@ -645,9 +650,7 @@ rec {
functor = defaultFunctor name // {
type = types.submoduleWith;
payload = {
modules = modules;
specialArgs = specialArgs;
shorthandOnlyDefinesConfig = shorthandOnlyDefinesConfig;
inherit modules specialArgs shorthandOnlyDefinesConfig description;
};
binOp = lhs: rhs: {
modules = lhs.modules ++ rhs.modules;
@ -664,6 +667,14 @@ rec {
else if lhs.shorthandOnlyDefinesConfig == rhs.shorthandOnlyDefinesConfig
then lhs.shorthandOnlyDefinesConfig
else throw "A submoduleWith option is declared multiple times with conflicting shorthandOnlyDefinesConfig values";
description =
if lhs.description == null
then rhs.description
else if rhs.description == null
then lhs.description
else if lhs.description == rhs.description
then lhs.description
else throw "A submoduleWith option is declared multiple times with conflicting descriptions";
};
};
};