From ceebdcfc2ca2d37872c46f224503a36f4d25daa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Na=C3=AFm=20Favier?= Date: Thu, 19 May 2022 15:15:08 +0200 Subject: [PATCH] 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`. --- lib/types.nix | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/lib/types.nix b/lib/types.nix index 91b040d24553..f53bb132ff5e 100644 --- a/lib/types.nix +++ b/lib/types.nix @@ -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"; }; }; };