From 8751764236e5d85cc394652288cda7a63fe78f94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Na=C3=AFm=20Favier?= Date: Wed, 22 Mar 2023 11:23:21 +0100 Subject: [PATCH] lib/modules: better error for invalid option declarations Make `byName` aware of whether it's processing options or config to give slightly more accurate error messages. --- lib/modules.nix | 12 ++++++++---- lib/tests/modules.sh | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/modules.nix b/lib/modules.nix index 051dbe2ef896..9c3e2085e378 100644 --- a/lib/modules.nix +++ b/lib/modules.nix @@ -567,15 +567,19 @@ rec { zipAttrsWith (n: concatLists) (map (module: let subtree = module.${attr}; in if !(builtins.isAttrs subtree) then - throw '' - You're trying to declare a value of type `${builtins.typeOf subtree}' - rather than an attribute-set for the option + throw (if attr == "config" then '' + You're trying to define a value of type `${builtins.typeOf subtree}' + rather than an attribute set for the option `${builtins.concatStringsSep "." prefix}'! This usually happens if `${builtins.concatStringsSep "." prefix}' has option definitions inside that are not matched. Please check how to properly define this option by e.g. referring to `man 5 configuration.nix'! - '' + '' else '' + An option declaration for `${builtins.concatStringsSep "." prefix}' has type + `${builtins.typeOf subtree}' rather than an attribute set. + Did you mean to define this outside of `options'? + '') else mapAttrs (n: f module) subtree ) modules); diff --git a/lib/tests/modules.sh b/lib/tests/modules.sh index 8081b186a2f9..c1cf0a94a1b3 100755 --- a/lib/tests/modules.sh +++ b/lib/tests/modules.sh @@ -189,7 +189,7 @@ checkConfigOutput '^"foo"$' config.submodule.foo ./declare-submoduleWith-special ## shorthandOnlyDefines config behaves as expected checkConfigOutput '^true$' config.submodule.config ./declare-submoduleWith-shorthand.nix ./define-submoduleWith-shorthand.nix checkConfigError 'is not of type `boolean' config.submodule.config ./declare-submoduleWith-shorthand.nix ./define-submoduleWith-noshorthand.nix -checkConfigError "You're trying to declare a value of type \`bool'\n\s*rather than an attribute-set for the option" config.submodule.config ./declare-submoduleWith-noshorthand.nix ./define-submoduleWith-shorthand.nix +checkConfigError "You're trying to define a value of type \`bool'\n\s*rather than an attribute set for the option" config.submodule.config ./declare-submoduleWith-noshorthand.nix ./define-submoduleWith-shorthand.nix checkConfigOutput '^true$' config.submodule.config ./declare-submoduleWith-noshorthand.nix ./define-submoduleWith-noshorthand.nix ## submoduleWith should merge all modules in one swoop