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.
		
	
			
		
			
				
	
	
		
			57 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			57 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 ./.
 |