about summary refs log tree commit diff stats
path: root/lib/default.nix
blob: dfa9fb17fe35981116e2420c5e397eea74ea7a2b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
{}: 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 =
    # Since Nix 2.23, https://github.com/NixOS/nix/pull/10592
    builtins.warn
    or (
      # Do not eta reduce v, so that we have the same strictness as `builtins.warn`.
      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 "${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:
  # ```nix
  # let
  # attr1 = {atuin = "first"; default = "second";};
  # attr2 = {atuin = "hi"; other = "hi2";};
  # in
  # maybeMerge attr1 attr2 "Failed to merge"
  # ```
  # # 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
    if overridden != {}
    then
      warn "Attributes overridden while merging ${sourceSet}: ${mkWarning overridden}"
      merged
    else merged;
}