feat(build): Add initial read-tree.nix implementation
This file can read a directory tree into a package set structure, paving the way for getting rid of top-level mapping in default.nix.
This commit is contained in:
parent
8e53dec88c
commit
4d852e2ef7
1 changed files with 67 additions and 0 deletions
67
read-tree.nix
Normal file
67
read-tree.nix
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
path: self: super:
|
||||||
|
|
||||||
|
let
|
||||||
|
inherit (builtins)
|
||||||
|
attrNames
|
||||||
|
attrValues
|
||||||
|
filter
|
||||||
|
head
|
||||||
|
isString
|
||||||
|
listToAttrs
|
||||||
|
map
|
||||||
|
match
|
||||||
|
readDir
|
||||||
|
tail
|
||||||
|
toPath
|
||||||
|
toString;
|
||||||
|
|
||||||
|
args = { pkgs = self; };
|
||||||
|
|
||||||
|
zipAttrs = names: values:
|
||||||
|
if (names == []) || (values == [])
|
||||||
|
then []
|
||||||
|
else [{
|
||||||
|
name = head names;
|
||||||
|
value = head values;
|
||||||
|
}] ++ zipAttrs (tail names) (tail values);
|
||||||
|
|
||||||
|
attrsToList = attrs: zipAttrs (attrNames attrs) (attrValues attrs);
|
||||||
|
|
||||||
|
isFile = s: s == "regular";
|
||||||
|
isDir = s: s == "directory";
|
||||||
|
|
||||||
|
joinPath = p: f: toPath ((toString p) + "/" + f);
|
||||||
|
|
||||||
|
isNixFile = file:
|
||||||
|
let res = match "(.*)\.nix" file;
|
||||||
|
in if res == null then null else head res;
|
||||||
|
|
||||||
|
filterNixFiles = dir:
|
||||||
|
let files = filter (e: isFile e.value) dir;
|
||||||
|
nixFiles = map (f: {
|
||||||
|
# Name and value are intentionally flipped to get the
|
||||||
|
# correct attribute set structure back out
|
||||||
|
name = isNixFile f.name;
|
||||||
|
value = f.name; # i.e. the path
|
||||||
|
}) files;
|
||||||
|
in filter (f: isString f.name) nixFiles;
|
||||||
|
|
||||||
|
traverse = path: dir:
|
||||||
|
let nixFiles = filterNixFiles dir;
|
||||||
|
imported = map (f: {
|
||||||
|
inherit (f) name;
|
||||||
|
value = import (joinPath path f.value) args;
|
||||||
|
}) nixFiles;
|
||||||
|
dirs = map (d: {
|
||||||
|
inherit (d) name;
|
||||||
|
value = readTree (joinPath path d.name);
|
||||||
|
}) (filter (e: isDir e.value) dir);
|
||||||
|
in listToAttrs (imported ++ dirs);
|
||||||
|
|
||||||
|
importOr = path: dir: f:
|
||||||
|
if dir ? "default.nix"
|
||||||
|
then import path args
|
||||||
|
else f path (attrsToList dir);
|
||||||
|
|
||||||
|
readTree = path: importOr path (readDir path) traverse;
|
||||||
|
in readTree path
|
Loading…
Reference in a new issue