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