diff --git a/lib/attrsets.nix b/lib/attrsets.nix index 7dae595c9e39..96af967c53f8 100644 --- a/lib/attrsets.nix +++ b/lib/attrsets.nix @@ -1800,22 +1800,27 @@ rec { ::: */ matchAttrs = - pattern: attrs: + let + recurse = + pattern: attrs: + all ( + # Compare equality between `pattern` & `attrs`. + attr: + # Missing attr, not equal. + attrs ? ${attr} + && ( + let + lhs = pattern.${attr}; + rhs = attrs.${attr}; + in + # If attrset check recursively + if isAttrs lhs then isAttrs rhs && recurse lhs rhs else lhs == rhs + ) + ) (attrNames pattern); + in + pattern: assert isAttrs pattern; - all ( - # Compare equality between `pattern` & `attrs`. - attr: - # Missing attr, not equal. - attrs ? ${attr} - && ( - let - lhs = pattern.${attr}; - rhs = attrs.${attr}; - in - # If attrset check recursively - if isAttrs lhs then isAttrs rhs && matchAttrs lhs rhs else lhs == rhs - ) - ) (attrNames pattern); + recurse pattern; /** Override only the attributes that are already present in the old set