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