58 lines
1.5 KiB
Nix
58 lines
1.5 KiB
Nix
|
# Based on https://github.com/MatthewCroughan/nixcfg/blob/afab322e6da20cc038d8577dd4a365673702d183/modules/default.nix.
|
||
|
# Autoloads files within modules/ and makes them available by their module
|
||
|
# type and name, e.g. `mixins-zsh`, `editor-nvim` and `users-opdavies` when
|
||
|
# imported with `inputs.self.nixosModules`.
|
||
|
|
||
|
{ lib }:
|
||
|
|
||
|
let
|
||
|
inherit (builtins)
|
||
|
attrNames
|
||
|
filter
|
||
|
listToAttrs
|
||
|
map
|
||
|
readDir
|
||
|
toString
|
||
|
;
|
||
|
|
||
|
inherit (lib)
|
||
|
filterAttrs
|
||
|
foldAttrs
|
||
|
hasSuffix
|
||
|
mapAttrsToList
|
||
|
nameValuePair
|
||
|
removeSuffix
|
||
|
zipListsWith
|
||
|
;
|
||
|
|
||
|
inherit (lib.filesystem) listFilesRecursive;
|
||
|
|
||
|
generateModules =
|
||
|
folder: prefix:
|
||
|
|
||
|
let
|
||
|
findSuffix = suffix: dir: (filter (x: (hasSuffix suffix (toString x))) (listFilesRecursive dir));
|
||
|
|
||
|
allNixFiles = findSuffix ".nix" folder;
|
||
|
|
||
|
allModuleNames = map (removeSuffix ".nix") (map baseNameOf allNixFiles);
|
||
|
|
||
|
zippedList = (
|
||
|
zipListsWith (x: y: nameValuePair (prefix + "-" + x) (import y)) allModuleNames allNixFiles
|
||
|
);
|
||
|
in
|
||
|
listToAttrs zippedList;
|
||
|
generateModulesAuto =
|
||
|
root:
|
||
|
let
|
||
|
moduleFolderNames = attrNames (filterAttrs (n: v: v == "directory") (readDir (toString root)));
|
||
|
moduleFolderPaths = map (x: (toString root) + "/" + x) moduleFolderNames;
|
||
|
|
||
|
zippedList = listToAttrs (
|
||
|
zipListsWith (x: y: nameValuePair x y) moduleFolderNames moduleFolderPaths
|
||
|
);
|
||
|
in
|
||
|
foldAttrs (item: acc: item) { } (mapAttrsToList (n: v: generateModules v n) zippedList);
|
||
|
in
|
||
|
generateModulesAuto ./.
|