Commit 413f4666 authored by dramforever's avatar dramforever
Browse files

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.
parent 82648ce6
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -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 ];