From 413f4666cdd4813f34de17b174c7f93dd573ec41 Mon Sep 17 00:00:00 2001 From: dramforever Date: Sun, 22 Mar 2026 13:49:52 +0800 Subject: [PATCH] lib/modules: Improve errors involving pushDownProperties If an attrset option was given a definition like: { system = lib.mkIf true false; } Before this change, we get the non-explanatory error message: error: expected a set but found a Boolean: true With the stack trace having nothing to do with the module involved. After this change, we get the better: error: In module `[...]', you're trying to define a value of type `bool' [...] Which names the actual module involved. --- lib/modules.nix | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/modules.nix b/lib/modules.nix index c67ea2247ca7..054f18a004f3 100644 --- a/lib/modules.nix +++ b/lib/modules.nix @@ -1320,13 +1320,24 @@ let : 1\. Function argument */ pushDownProperties = + let + mapAttrsIfAttrs = + f: val: + if isAttrs val then + mapAttrs f val + else + # This does not actually work, since arriving here means we have e.g. + # (lib.mkIf cond nonAttrs), while an attrset is expected. However, + # avoiding the mapAttrs call here gives better errors later. + val; + in cfg: if cfg._type or "" == "merge" then concatMap pushDownProperties cfg.contents else if cfg._type or "" == "if" then - map (mapAttrs (n: v: mkIf cfg.condition v)) (pushDownProperties cfg.content) + map (mapAttrsIfAttrs (n: v: mkIf cfg.condition v)) (pushDownProperties cfg.content) else if cfg._type or "" == "override" then - map (mapAttrs (n: v: mkOverride cfg.priority v)) (pushDownProperties cfg.content) + map (mapAttrsIfAttrs (n: v: mkOverride cfg.priority v)) (pushDownProperties cfg.content) # FIXME: handle mkOrder? else [ cfg ];