about summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/default.nix29
1 files changed, 17 insertions, 12 deletions
diff --git a/lib/default.nix b/lib/default.nix
index 7c86aba1..dfa9fb17 100644
--- a/lib/default.nix
+++ b/lib/default.nix
@@ -1,4 +1,7 @@
 {}: let
+  # string -> string -> string
+  colorize = color: string: "[${color}m${string}";
+
   # Taken from `nixpkgs/lib`.
   # Is here to avoid a dependency on `lib` (making this file easy to test with `nix eval`)
   warn =
@@ -9,13 +12,13 @@
       msg: v:
       # `builtins.warn` requires a string message, so we enforce that in our implementation, so that callers aren't accidentally incompatible with newer Nix versions.
         assert builtins.isString msg;
-          builtins.trace "evaluation warning: ${msg}" v
+          builtins.trace "${colorize "1;35" "evaluation warning:"} ${msg}" v
     );
 in {
   mkByName = import ./by-name-overlay.nix {inherit warn;};
 
   # Only merge two attrsets if the RHS does not share names with the LHS.
-  # Example:
+  # # Example:
   # ```nix
   # let
   # attr1 = {atuin = "first"; default = "second";};
@@ -23,15 +26,17 @@ in {
   # in
   # maybeMerge attr1 attr2 "Failed to merge"
   # ```
-  maybeMerge = attr1: attr2: message: let
-    list1 = builtins.attrNames attr1;
-
-    check = name2: value:
-      if builtins.elem name2 list1
-      then warn "Overriding ${name2} while merging two attrs sets: ${message}" value
-      else value;
-
-    checkedAttr2 = builtins.mapAttrs check attr2;
+  # # Type:
+  # {} -> {} -> string -> {}
+  maybeMerge = lhs: rhs: sourceSet: let
+    overridden = builtins.intersectAttrs lhs rhs;
+    merged = lhs // rhs;
+    mkWarning = overriddenAttrs:
+      builtins.concatStringsSep " " (builtins.map (colorize "1;97") (builtins.attrNames overriddenAttrs));
   in
-    attr1 // checkedAttr2;
+    if overridden != {}
+    then
+      warn "Attributes overridden while merging ${sourceSet}: ${mkWarning overridden}"
+      merged
+    else merged;
 }