lib.modules: Make option injection work when shorthandOnlyDefinesConfig

+1
lib/modules.nix
···
options = mkOption {
type = types.submoduleWith {
modules = [ { options = decl.options; } ];
};
};
};
···
options = mkOption {
type = types.submoduleWith {
modules = [ { options = decl.options; } ];
+
shorthandOnlyDefinesConfig = null;
};
};
};
+1
lib/tests/modules.sh
···
checkConfigOutput '^2$' config.bare-submodule.deep ./declare-bare-submodule.nix ./declare-bare-submodule-deep-option.nix
checkConfigOutput '^42$' config.bare-submodule.nested ./declare-bare-submodule.nix ./declare-bare-submodule-nested-option.nix ./declare-bare-submodule-deep-option.nix ./define-bare-submodule-values.nix
checkConfigOutput '^420$' config.bare-submodule.deep ./declare-bare-submodule.nix ./declare-bare-submodule-nested-option.nix ./declare-bare-submodule-deep-option.nix ./define-bare-submodule-values.nix
# Check integer types.
# unsigned
···
checkConfigOutput '^2$' config.bare-submodule.deep ./declare-bare-submodule.nix ./declare-bare-submodule-deep-option.nix
checkConfigOutput '^42$' config.bare-submodule.nested ./declare-bare-submodule.nix ./declare-bare-submodule-nested-option.nix ./declare-bare-submodule-deep-option.nix ./define-bare-submodule-values.nix
checkConfigOutput '^420$' config.bare-submodule.deep ./declare-bare-submodule.nix ./declare-bare-submodule-nested-option.nix ./declare-bare-submodule-deep-option.nix ./define-bare-submodule-values.nix
+
checkConfigOutput '^2$' config.bare-submodule.deep ./declare-bare-submodule.nix ./declare-bare-submodule-deep-option.nix ./define-shorthandOnlyDefinesConfig-true.nix
# Check integer types.
# unsigned
+2 -1
lib/tests/modules/declare-bare-submodule-nested-option.nix
···
-
{ lib, ... }:
let
inherit (lib) mkOption types;
in
{
options.bare-submodule = mkOption {
type = types.submoduleWith {
modules = [
{
options.nested = mkOption {
···
+
{ config, lib, ... }:
let
inherit (lib) mkOption types;
in
{
options.bare-submodule = mkOption {
type = types.submoduleWith {
+
shorthandOnlyDefinesConfig = config.shorthandOnlyDefinesConfig;
modules = [
{
options.nested = mkOption {
+7 -1
lib/tests/modules/declare-bare-submodule.nix
···
-
{ lib, ... }:
let
inherit (lib) mkOption types;
in
···
options.bare-submodule = mkOption {
type = types.submoduleWith {
modules = [ ];
};
default = {};
};
}
···
+
{ config, lib, ... }:
let
inherit (lib) mkOption types;
in
···
options.bare-submodule = mkOption {
type = types.submoduleWith {
modules = [ ];
+
shorthandOnlyDefinesConfig = config.shorthandOnlyDefinesConfig;
};
default = {};
+
};
+
+
# config-dependent options: won't recommend, but useful for making this test parameterized
+
options.shorthandOnlyDefinesConfig = mkOption {
+
default = false;
};
}
+1
lib/tests/modules/define-shorthandOnlyDefinesConfig-true.nix
···
···
+
{ shorthandOnlyDefinesConfig = true; }
+5 -1
lib/types.nix
···
then lhs.specialArgs // rhs.specialArgs
else throw "A submoduleWith option is declared multiple times with the same specialArgs \"${toString (attrNames intersecting)}\"";
shorthandOnlyDefinesConfig =
-
if lhs.shorthandOnlyDefinesConfig == rhs.shorthandOnlyDefinesConfig
then lhs.shorthandOnlyDefinesConfig
else throw "A submoduleWith option is declared multiple times with conflicting shorthandOnlyDefinesConfig values";
};
···
then lhs.specialArgs // rhs.specialArgs
else throw "A submoduleWith option is declared multiple times with the same specialArgs \"${toString (attrNames intersecting)}\"";
shorthandOnlyDefinesConfig =
+
if lhs.shorthandOnlyDefinesConfig == null
+
then rhs.shorthandOnlyDefinesConfig
+
else if rhs.shorthandOnlyDefinesConfig == null
+
then lhs.shorthandOnlyDefinesConfig
+
else if lhs.shorthandOnlyDefinesConfig == rhs.shorthandOnlyDefinesConfig
then lhs.shorthandOnlyDefinesConfig
else throw "A submoduleWith option is declared multiple times with conflicting shorthandOnlyDefinesConfig values";
};