From eea806e0f8cc39ccd2a427d35bf4cefc4f7c9232 Mon Sep 17 00:00:00 2001 From: Oliver Davies Date: Thu, 10 Apr 2025 08:56:11 +0100 Subject: [PATCH] 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 https://github.com/MatthewCroughan/nixcfg/blob/afab322e6da20cc038d8577dd4a365673702d183/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. --- flake.nix | 2 + hosts/PW05CH3L/configuration.nix | 32 +++++------ hosts/hetznix/configuration.nix | 7 ++- hosts/lemp11/configuration.nix | 14 +++-- hosts/nixedo/configuration.nix | 14 +++-- hosts/t480/configuration.nix | 56 +++++++++--------- hosts/t490/configuration.nix | 8 +-- modules/default.nix | 57 +++++++++++++++++++ modules/mixins/common.nix | 3 + modules/mixins/phpactor.nix | 3 + modules/mixins/scripts.nix | 3 + modules/mixins/zsh.nix | 3 + modules/profiles/dwm.nix | 1 + .../default.nix => modules/users/eric.nix | 0 .../default.nix => modules/users/luke.nix | 0 .../default.nix => modules/users/opdavies.nix | 0 16 files changed, 140 insertions(+), 63 deletions(-) create mode 100644 modules/default.nix create mode 100644 modules/mixins/common.nix create mode 100644 modules/mixins/phpactor.nix create mode 100644 modules/mixins/scripts.nix create mode 100644 modules/mixins/zsh.nix create mode 100644 modules/profiles/dwm.nix rename users/eric/default.nix => modules/users/eric.nix (100%) rename users/luke/default.nix => modules/users/luke.nix (100%) rename users/opdavies/default.nix => modules/users/opdavies.nix (100%) diff --git a/flake.nix b/flake.nix index 27e4c9c0..0caf4d02 100644 --- a/flake.nix +++ b/flake.nix @@ -150,5 +150,7 @@ ]; }; }; + + nixosModules = import ./modules { lib = nixpkgs.lib; }; }; } diff --git a/hosts/PW05CH3L/configuration.nix b/hosts/PW05CH3L/configuration.nix index aa942d86..e21afcbf 100644 --- a/hosts/PW05CH3L/configuration.nix +++ b/hosts/PW05CH3L/configuration.nix @@ -1,4 +1,4 @@ -{ username, ... }: +{ inputs, username, ... }: let git = { @@ -7,26 +7,26 @@ let }; in { - imports = [ - ../../modules/editor/nvim.nix - ../../modules/mixins/common - ../../modules/mixins/direnv.nix - ../../modules/mixins/docker.nix - ../../modules/mixins/fzf.nix - ../../modules/mixins/node.nix - ../../modules/mixins/phpactor - ../../modules/mixins/ranger.nix - ../../modules/mixins/scripts - ../../modules/mixins/starship.nix - ../../modules/mixins/tmux.nix - ../../modules/mixins/zsh + imports = with inputs.self.nixosModules; [ + editor-nvim + mixins-common + mixins-direnv + mixins-docker + mixins-fzf + mixins-node + mixins-phpactor + mixins-ranger + mixins-scripts + mixins-starship + mixins-tmux + mixins-zsh + + users-opdavies (import ../../modules/mixins/git.nix { inherit git; }) ./modules/notes.nix ./modules/wiki.nix - - ../../users/opdavies ]; wsl = { diff --git a/hosts/hetznix/configuration.nix b/hosts/hetznix/configuration.nix index a302c70f..bef69384 100644 --- a/hosts/hetznix/configuration.nix +++ b/hosts/hetznix/configuration.nix @@ -1,11 +1,12 @@ { - modulesPath, + inputs, lib, + modulesPath, pkgs, ... }: { - imports = [ + imports = with inputs.self.nixosModules; [ (modulesPath + "/installer/scan/not-detected.nix") (modulesPath + "/profiles/qemu-guest.nix") @@ -16,7 +17,7 @@ ./security ./services - ../../users/opdavies + ../../modules/users/opdavies.nix ]; nix = { diff --git a/hosts/lemp11/configuration.nix b/hosts/lemp11/configuration.nix index 1e604d4f..550ccc50 100644 --- a/hosts/lemp11/configuration.nix +++ b/hosts/lemp11/configuration.nix @@ -1,16 +1,18 @@ +{ inputs, ... }: + { - imports = [ + imports = with inputs.self.nixosModules; [ ./hardware-configuration.nix ./hardware.nix ./programs.nix ./services.nix - ../../modules/mixins/common - ../../modules/mixins/zsh + mixins-common + mixins-zsh - ../../users/opdavies - ../../users/eric - ../../users/luke + users-opdavies + users-eric + users-luke ]; # Bootloader. diff --git a/hosts/nixedo/configuration.nix b/hosts/nixedo/configuration.nix index 5ed7e757..3470a415 100644 --- a/hosts/nixedo/configuration.nix +++ b/hosts/nixedo/configuration.nix @@ -2,15 +2,19 @@ # your system. Help is available in the configuration.nix(5) man page # and in the NixOS manual (accessible by running ‘nixos-help’). +{ inputs, ... }: + { - imports = [ + imports = with inputs.self.nixosModules; [ ./hardware-configuration.nix ./secrets.nix ./services.nix - ../../modules/mixins/common - ../../modules/mixins/docker.nix - ../../modules/mixins/zsh + mixins-common + mixins-docker + mixins-zsh + + users-opdavies ./modules/acme.nix ./modules/audiobookshelf.nix @@ -19,8 +23,6 @@ ./modules/immich.nix ./modules/jellyfin.nix ./modules/paperless.nix - - ../../users/opdavies ]; nixosModules = { diff --git a/hosts/t480/configuration.nix b/hosts/t480/configuration.nix index 7e7961ce..6d8874c9 100644 --- a/hosts/t480/configuration.nix +++ b/hosts/t480/configuration.nix @@ -1,4 +1,4 @@ -{ pkgs, ... }: +{ inputs, pkgs, ... }: let git = { @@ -7,35 +7,35 @@ let }; in { - imports = [ + imports = with inputs.self.nixosModules; [ ./hardware-configuration.nix ./secrets.nix - ../../modules/editor/nvim.nix - ../../modules/mixins/bluetooth.nix - ../../modules/mixins/common - ../../modules/mixins/direnv.nix - ../../modules/mixins/docker.nix - ../../modules/mixins/firefox.nix - ../../modules/mixins/flameshot.nix - ../../modules/mixins/fonts.nix - ../../modules/mixins/fzf.nix - ../../modules/mixins/gnupg.nix - ../../modules/mixins/gtk.nix - ../../modules/mixins/qutebrowser.nix - ../../modules/mixins/mpv.nix - ../../modules/mixins/node.nix - ../../modules/mixins/phpactor - ../../modules/mixins/pipewire.nix - ../../modules/mixins/ranger.nix - ../../modules/mixins/screenkey.nix - ../../modules/mixins/scripts - ../../modules/mixins/starship.nix - ../../modules/mixins/thunar.nix - ../../modules/mixins/tmux.nix - ../../modules/mixins/zsh - ../../modules/profiles/dwm - ../../modules/profiles/xbanish.nix + editor-nvim + mixins-bluetooth + mixins-common + mixins-direnv + mixins-docker + mixins-firefox + mixins-flameshot + mixins-fonts + mixins-fzf + mixins-gnupg + mixins-gtk + mixins-qutebrowser + mixins-mpv + mixins-node + mixins-phpactor + mixins-pipewire + mixins-ranger + mixins-screenkey + mixins-scripts + mixins-starship + mixins-thunar + mixins-tmux + mixins-zsh + profiles-dwm + profiles-xbanish (import ../../modules/mixins/git.nix { inherit git; }) @@ -45,7 +45,7 @@ in ]; }) - ../../users/opdavies + users-opdavies ./modules/cron.nix ./modules/neomutt.nix diff --git a/hosts/t490/configuration.nix b/hosts/t490/configuration.nix index e8f77357..b7959b14 100644 --- a/hosts/t490/configuration.nix +++ b/hosts/t490/configuration.nix @@ -1,7 +1,7 @@ -{ pkgs, ... }: +{ inputs, pkgs, ... }: { - imports = [ + imports = with inputs.self.nixosModules; [ ./hardware-configuration.nix ./hardware.nix ./programs.nix @@ -9,9 +9,9 @@ ./services ./users.nix - ../../modules/mixins/common + mixins-common - ../../users/opdavies + users-opdavies ]; boot = { diff --git a/modules/default.nix b/modules/default.nix new file mode 100644 index 00000000..d55ad57c --- /dev/null +++ b/modules/default.nix @@ -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 ./. diff --git a/modules/mixins/common.nix b/modules/mixins/common.nix new file mode 100644 index 00000000..1579f83f --- /dev/null +++ b/modules/mixins/common.nix @@ -0,0 +1,3 @@ +{ + imports = [ ./common ]; +} diff --git a/modules/mixins/phpactor.nix b/modules/mixins/phpactor.nix new file mode 100644 index 00000000..426c502c --- /dev/null +++ b/modules/mixins/phpactor.nix @@ -0,0 +1,3 @@ +{ + imports = [ ./phpactor ]; +} diff --git a/modules/mixins/scripts.nix b/modules/mixins/scripts.nix new file mode 100644 index 00000000..680de22c --- /dev/null +++ b/modules/mixins/scripts.nix @@ -0,0 +1,3 @@ +{ + imports = [ ./scripts ]; +} diff --git a/modules/mixins/zsh.nix b/modules/mixins/zsh.nix new file mode 100644 index 00000000..f42fd619 --- /dev/null +++ b/modules/mixins/zsh.nix @@ -0,0 +1,3 @@ +{ + imports = [ ./zsh ]; +} diff --git a/modules/profiles/dwm.nix b/modules/profiles/dwm.nix new file mode 100644 index 00000000..2694857b --- /dev/null +++ b/modules/profiles/dwm.nix @@ -0,0 +1 @@ +{ imports = [ ./dwm ]; } diff --git a/users/eric/default.nix b/modules/users/eric.nix similarity index 100% rename from users/eric/default.nix rename to modules/users/eric.nix diff --git a/users/luke/default.nix b/modules/users/luke.nix similarity index 100% rename from users/luke/default.nix rename to modules/users/luke.nix diff --git a/users/opdavies/default.nix b/modules/users/opdavies.nix similarity index 100% rename from users/opdavies/default.nix rename to modules/users/opdavies.nix