Allow for autoloading modules
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`.
Based on afab322e6d/modules/default.nix
.
This assumes there will be a modules/*.nix file and currently doesn't
work with modules/*/default.nix. This is something I'd like to add in
the future.
I also want find a cleaner way to pass arguments into these shortcuts as
this also doesn't work in their implementation as far as I can see.
This commit is contained in:
parent
797d1206b0
commit
eea806e0f8
16 changed files with 140 additions and 63 deletions
57
modules/default.nix
Normal file
57
modules/default.nix
Normal file
|
@ -0,0 +1,57 @@
|
|||
# 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 ./.
|
Loading…
Add table
Add a link
Reference in a new issue