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:
Oliver Davies 2025-04-10 08:56:11 +01:00
parent 797d1206b0
commit eea806e0f8
16 changed files with 140 additions and 63 deletions

View file

@ -150,5 +150,7 @@
]; ];
}; };
}; };
nixosModules = import ./modules { lib = nixpkgs.lib; };
}; };
} }

View file

@ -1,4 +1,4 @@
{ username, ... }: { inputs, username, ... }:
let let
git = { git = {
@ -7,26 +7,26 @@ let
}; };
in in
{ {
imports = [ imports = with inputs.self.nixosModules; [
../../modules/editor/nvim.nix editor-nvim
../../modules/mixins/common mixins-common
../../modules/mixins/direnv.nix mixins-direnv
../../modules/mixins/docker.nix mixins-docker
../../modules/mixins/fzf.nix mixins-fzf
../../modules/mixins/node.nix mixins-node
../../modules/mixins/phpactor mixins-phpactor
../../modules/mixins/ranger.nix mixins-ranger
../../modules/mixins/scripts mixins-scripts
../../modules/mixins/starship.nix mixins-starship
../../modules/mixins/tmux.nix mixins-tmux
../../modules/mixins/zsh mixins-zsh
users-opdavies
(import ../../modules/mixins/git.nix { inherit git; }) (import ../../modules/mixins/git.nix { inherit git; })
./modules/notes.nix ./modules/notes.nix
./modules/wiki.nix ./modules/wiki.nix
../../users/opdavies
]; ];
wsl = { wsl = {

View file

@ -1,11 +1,12 @@
{ {
modulesPath, inputs,
lib, lib,
modulesPath,
pkgs, pkgs,
... ...
}: }:
{ {
imports = [ imports = with inputs.self.nixosModules; [
(modulesPath + "/installer/scan/not-detected.nix") (modulesPath + "/installer/scan/not-detected.nix")
(modulesPath + "/profiles/qemu-guest.nix") (modulesPath + "/profiles/qemu-guest.nix")
@ -16,7 +17,7 @@
./security ./security
./services ./services
../../users/opdavies ../../modules/users/opdavies.nix
]; ];
nix = { nix = {

View file

@ -1,16 +1,18 @@
{ inputs, ... }:
{ {
imports = [ imports = with inputs.self.nixosModules; [
./hardware-configuration.nix ./hardware-configuration.nix
./hardware.nix ./hardware.nix
./programs.nix ./programs.nix
./services.nix ./services.nix
../../modules/mixins/common mixins-common
../../modules/mixins/zsh mixins-zsh
../../users/opdavies users-opdavies
../../users/eric users-eric
../../users/luke users-luke
]; ];
# Bootloader. # Bootloader.

View file

@ -2,15 +2,19 @@
# your system. Help is available in the configuration.nix(5) man page # your system. Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running nixos-help). # and in the NixOS manual (accessible by running nixos-help).
{ inputs, ... }:
{ {
imports = [ imports = with inputs.self.nixosModules; [
./hardware-configuration.nix ./hardware-configuration.nix
./secrets.nix ./secrets.nix
./services.nix ./services.nix
../../modules/mixins/common mixins-common
../../modules/mixins/docker.nix mixins-docker
../../modules/mixins/zsh mixins-zsh
users-opdavies
./modules/acme.nix ./modules/acme.nix
./modules/audiobookshelf.nix ./modules/audiobookshelf.nix
@ -19,8 +23,6 @@
./modules/immich.nix ./modules/immich.nix
./modules/jellyfin.nix ./modules/jellyfin.nix
./modules/paperless.nix ./modules/paperless.nix
../../users/opdavies
]; ];
nixosModules = { nixosModules = {

View file

@ -1,4 +1,4 @@
{ pkgs, ... }: { inputs, pkgs, ... }:
let let
git = { git = {
@ -7,35 +7,35 @@ let
}; };
in in
{ {
imports = [ imports = with inputs.self.nixosModules; [
./hardware-configuration.nix ./hardware-configuration.nix
./secrets.nix ./secrets.nix
../../modules/editor/nvim.nix editor-nvim
../../modules/mixins/bluetooth.nix mixins-bluetooth
../../modules/mixins/common mixins-common
../../modules/mixins/direnv.nix mixins-direnv
../../modules/mixins/docker.nix mixins-docker
../../modules/mixins/firefox.nix mixins-firefox
../../modules/mixins/flameshot.nix mixins-flameshot
../../modules/mixins/fonts.nix mixins-fonts
../../modules/mixins/fzf.nix mixins-fzf
../../modules/mixins/gnupg.nix mixins-gnupg
../../modules/mixins/gtk.nix mixins-gtk
../../modules/mixins/qutebrowser.nix mixins-qutebrowser
../../modules/mixins/mpv.nix mixins-mpv
../../modules/mixins/node.nix mixins-node
../../modules/mixins/phpactor mixins-phpactor
../../modules/mixins/pipewire.nix mixins-pipewire
../../modules/mixins/ranger.nix mixins-ranger
../../modules/mixins/screenkey.nix mixins-screenkey
../../modules/mixins/scripts mixins-scripts
../../modules/mixins/starship.nix mixins-starship
../../modules/mixins/thunar.nix mixins-thunar
../../modules/mixins/tmux.nix mixins-tmux
../../modules/mixins/zsh mixins-zsh
../../modules/profiles/dwm profiles-dwm
../../modules/profiles/xbanish.nix profiles-xbanish
(import ../../modules/mixins/git.nix { inherit git; }) (import ../../modules/mixins/git.nix { inherit git; })
@ -45,7 +45,7 @@ in
]; ];
}) })
../../users/opdavies users-opdavies
./modules/cron.nix ./modules/cron.nix
./modules/neomutt.nix ./modules/neomutt.nix

View file

@ -1,7 +1,7 @@
{ pkgs, ... }: { inputs, pkgs, ... }:
{ {
imports = [ imports = with inputs.self.nixosModules; [
./hardware-configuration.nix ./hardware-configuration.nix
./hardware.nix ./hardware.nix
./programs.nix ./programs.nix
@ -9,9 +9,9 @@
./services ./services
./users.nix ./users.nix
../../modules/mixins/common mixins-common
../../users/opdavies users-opdavies
]; ];
boot = { boot = {

57
modules/default.nix Normal file
View 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 ./.

View file

@ -0,0 +1,3 @@
{
imports = [ ./common ];
}

View file

@ -0,0 +1,3 @@
{
imports = [ ./phpactor ];
}

View file

@ -0,0 +1,3 @@
{
imports = [ ./scripts ];
}

3
modules/mixins/zsh.nix Normal file
View file

@ -0,0 +1,3 @@
{
imports = [ ./zsh ];
}

1
modules/profiles/dwm.nix Normal file
View file

@ -0,0 +1 @@
{ imports = [ ./dwm ]; }