zaphyra's git: haumea

fork of https://github.com/nix-community/haumea

commit 458f66279fccb8865638a68238851fba9249bf69
parent 781417bcd1a223310370b274a15f0f39f721d96e
Author: figsoda <figsoda@pm.me>
Date: Wed, 5 Apr 2023 13:05:25 -0400

transformers: add liftDefault
7 files changed, 56 insertions(+), 0 deletions(-)
diff --git a/README.md b/README.md
@@ -166,6 +166,14 @@ Type: `{ ... } -> Path -> a`
 This loader will simply `import` the file without providing any input.
 It is useful when the files being loaded are mostly functions that don't require any external input.
 
+### [`transformers.liftDefault`](src/transformers/liftDefault.nix)
+
+Type: `{ ... } -> { ... }`
+
+This transformer will lift the contents of `default` into the module.
+It will fail if `default` is not an attribute set,
+or has any overlapping attributes with the module.
+
 ## Alternatives
 
 [std](https://github.com/divnix/std) is a more full-featured framework that also has filesystem-based auto-importing.
diff --git a/src/transformers/liftDefault.nix b/src/transformers/liftDefault.nix
@@ -0,0 +1,13 @@
+{ lib }:
+
+let
+  inherit (lib.attrsets)
+    unionOfDisjoint
+    ;
+in
+
+mod:
+
+unionOfDisjoint
+  (removeAttrs mod [ "default" ])
+  (mod.default or { })
diff --git a/tests/liftDefault/__fixture/bar.nix b/tests/liftDefault/__fixture/bar.nix
@@ -0,0 +1 @@
+"bar"
diff --git a/tests/liftDefault/__fixture/default.nix b/tests/liftDefault/__fixture/default.nix
@@ -0,0 +1,4 @@
+{
+  bar = "notbar";
+  baz = "baz";
+}
diff --git a/tests/liftDefault/__fixture/foo.nix b/tests/liftDefault/__fixture/foo.nix
@@ -0,0 +1 @@
+"foo"
diff --git a/tests/liftDefault/expected.nix b/tests/liftDefault/expected.nix
@@ -0,0 +1,14 @@
+{
+  foo = {
+    success = true;
+    value = "foo";
+  };
+  bar = {
+    success = false;
+    value = false;
+  };
+  baz = {
+    success = true;
+    value = "baz";
+  };
+}
diff --git a/tests/liftDefault/expr.nix b/tests/liftDefault/expr.nix
@@ -0,0 +1,15 @@
+{ haumea }:
+
+let
+  inherit (builtins)
+    mapAttrs
+    tryEval
+    ;
+
+  loaded = haumea.load {
+    src = ./__fixture;
+    transformer = haumea.transformers.liftDefault;
+  };
+in
+
+mapAttrs (_: tryEval) loaded