From de43011b22bb0d3a29efdb05a2a5476415e186c3 Mon Sep 17 00:00:00 2001 From: reo101 Date: Tue, 25 Jul 2023 10:32:30 +0300 Subject: [PATCH] feat(flake)!: convert to fs-defined modules Place all modules in either: - `modules/${manager}/${module}.nix` - `modules/${manager}/${module}/default.nix` - `${manager}` - One of `nixos`, `nix-on-droid`, `nix-darwin` or `home-manager` - `${module}` - Module name (autoimported by configurations, used for exporting) --- modules/home-manager/README.md | 5 + modules/home-manager/default.nix | 10 -- modules/nix-darwin/README.md | 5 + modules/nix-darwin/default.nix | 10 -- modules/nix-on-droid/README.md | 5 + modules/nix-on-droid/default.nix | 7 -- modules/nixos/README.md | 5 + modules/nixos/default.nix | 8 -- .../{jellyfin.nix => jellyfin/default.nix} | 0 util/default.nix | 106 +++++++++++++----- 10 files changed, 98 insertions(+), 63 deletions(-) create mode 100644 modules/home-manager/README.md delete mode 100644 modules/home-manager/default.nix create mode 100644 modules/nix-darwin/README.md delete mode 100644 modules/nix-darwin/default.nix create mode 100644 modules/nix-on-droid/README.md delete mode 100644 modules/nix-on-droid/default.nix create mode 100644 modules/nixos/README.md delete mode 100644 modules/nixos/default.nix rename modules/nixos/{jellyfin.nix => jellyfin/default.nix} (100%) diff --git a/modules/home-manager/README.md b/modules/home-manager/README.md new file mode 100644 index 0000000..51c94e0 --- /dev/null +++ b/modules/home-manager/README.md @@ -0,0 +1,5 @@ +Add your reusable home-manager modules to this directory () + +These are considered modules: +- files, ending in `.nix` (excluding `default.nix`) +- directories, containing `default.nix` diff --git a/modules/home-manager/default.nix b/modules/home-manager/default.nix deleted file mode 100644 index b9cedd5..0000000 --- a/modules/home-manager/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -# Add your reusable home-manager modules to this directory, on their own file (https://nixos.wiki/wiki/Module). -# These should be stuff you would like to share with others, not your personal configurations. - -{ - # List your module files here - # my-module = import ./my-module.nix; - reo101-shell = import ./reo101-shell; - reo101-river = import ./reo101-river; - reo101-wezterm = import ./reo101-wezterm; -} diff --git a/modules/nix-darwin/README.md b/modules/nix-darwin/README.md new file mode 100644 index 0000000..c51c812 --- /dev/null +++ b/modules/nix-darwin/README.md @@ -0,0 +1,5 @@ +Add your reusable nix-darwin modules to this directory () + +These are considered modules: +- files, ending in `.nix` (excluding `default.nix`) +- directories, containing `default.nix` diff --git a/modules/nix-darwin/default.nix b/modules/nix-darwin/default.nix deleted file mode 100644 index 4a90fa6..0000000 --- a/modules/nix-darwin/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -# Add your reusable nix-darwin modules to this directory, on their own file (https://nixos.wiki/wiki/Module). -# These should be stuff you would like to share with others, not your personal configurations. - -{ - # List your module files here - # my-module = import ./my-module.nix; - brew = import ./brew; - yabai = import ./yabai; - system = import ./system; -} diff --git a/modules/nix-on-droid/README.md b/modules/nix-on-droid/README.md new file mode 100644 index 0000000..21f19db --- /dev/null +++ b/modules/nix-on-droid/README.md @@ -0,0 +1,5 @@ +Add your reusable nix-on-droid modules to this directory () + +These are considered modules: +- files, ending in `.nix` (excluding `default.nix`) +- directories, containing `default.nix` diff --git a/modules/nix-on-droid/default.nix b/modules/nix-on-droid/default.nix deleted file mode 100644 index bf1c581..0000000 --- a/modules/nix-on-droid/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -# Add your reusable nix-on-droid modules to this directory, on their own file (https://nixos.wiki/wiki/Module). -# These should be stuff you would like to share with others, not your personal configurations. - -{ - # List your module files here - # my-module = import ./my-module.nix; -} diff --git a/modules/nixos/README.md b/modules/nixos/README.md new file mode 100644 index 0000000..f2dfc13 --- /dev/null +++ b/modules/nixos/README.md @@ -0,0 +1,5 @@ +Add your reusable NixOS modules to this directory () + +These are considered modules: +- files, ending in `.nix` (excluding `default.nix`) +- directories, containing `default.nix` diff --git a/modules/nixos/default.nix b/modules/nixos/default.nix deleted file mode 100644 index beb65ef..0000000 --- a/modules/nixos/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -# Add your reusable NixOS modules to this directory, on their own file (https://nixos.wiki/wiki/Module). -# These should be stuff you would like to share with others, not your personal configurations. - -{ - # List your module files here - # my-module = import ./my-module.nix; - jellyfin = import ./jellyfin.nix; -} diff --git a/modules/nixos/jellyfin.nix b/modules/nixos/jellyfin/default.nix similarity index 100% rename from modules/nixos/jellyfin.nix rename to modules/nixos/jellyfin/default.nix diff --git a/util/default.nix b/util/default.nix index bc5604f..446a1cf 100644 --- a/util/default.nix +++ b/util/default.nix @@ -7,7 +7,12 @@ let inherit (lib.attrsets) filterAttrs; in rec { - # Directory walker + # Boolean helpers + and = lib.all lib.id; + or = lib.any lib.id; + eq = x: y: x == y; + + # Directory walking helpers recurseDir = dir: mapAttrs (file: type: @@ -17,27 +22,19 @@ rec { ) (builtins.readDir dir); - # NOTE: Implying `attrs` is the output of `recurseDir` - hasFiles = files: attrs: - builtins.all - lib.id + allSatisfy = predicate: attrs: attrset: + and (builtins.map - (file: - builtins.hasAttr file attrs && - builtins.getAttr file attrs == "regular") - files); + (attr: + builtins.hasAttr attr attrset && + predicate (builtins.getAttr attr attrset)) + attrs); - # NOTE: Implying `attrs` is the output of `recurseDir` - hasDirectories = directories: attrs: - builtins.all - lib.id - (builtins.map - (directory: - builtins.hasAttr directory attrs && - lib.isAttrs (builtins.getAttr directory attrs)) - directories); + # NOTE: Implying last argument is the output of `recurseDir` + hasFiles = allSatisfy (eq "regular"); - and = lib.all lib.id; + # NOTE: Implying last argument is the output of `recurseDir` + hasDirectories = allSatisfy lib.isAttrs; # pkgs helpers forEachSystem = lib.genAttrs [ @@ -53,18 +50,68 @@ rec { (system: f nixpkgs.legacyPackages.${system}); + # Modules helpers + createModules = baseDir: { passthru ? { inherit inputs outputs; }, ... }: + lib.pipe baseDir [ + # Read given directory + builtins.readDir + # Map each entry to a module + (lib.mapAttrs' + (name: type: + let + moduleDir = baseDir + "/${name}"; + in + if and [ + (type == "directory") + (hasFiles ["default.nix"] (builtins.readDir moduleDir)) + ] then + # Classic module in a directory + lib.nameValuePair + name + (import moduleDir) + else if and [ + (type == "regular") + (lib.hasSuffix ".nix" name) + ] then + # Classic module in a file + lib.nameValuePair + (lib.removeSuffix ".nix" name) + (import moduleDir) + else + # Invalid module + lib.nameValuePair + name + null)) + # Filter invalid modules + (lib.filterAttrs + (moduleName: module: + module != null)) + # Passthru if needed + (lib.mapAttrs + (moduleName: module: + if and [ + (builtins.isFunction + module) + (eq + (lib.pipe module [builtins.functionArgs builtins.attrNames]) + (lib.pipe passthru [builtins.attrNames])) + ] + then module passthru + else module)) + ]; + # Modules - nixosModules = import ../modules/nixos; - nixOnDroidModules = import ../modules/nix-on-droid; - nixDarwinModules = import ../modules/nix-darwin; - homeManagerModules = import ../modules/home-manager; + nixosModules = createModules ../modules/nixos { }; + nixOnDroidModules = createModules ../modules/nix-on-droid { }; + nixDarwinModules = createModules ../modules/nix-darwin { }; + homeManagerModules = createModules ../modules/home-manager { }; # Machines machines = recurseDir ../machines; homeManagerMachines = machines.home-manager or { }; - nixDarwinMachines = machines.nix-darwin or { }; - nixOnDroidMachines = machines.nix-on-droid or { }; - nixosMachines = machines.nixos or { }; + nixDarwinMachines = machines.nix-darwin or { }; + nixOnDroidMachines = machines.nix-on-droid or { }; + nixosMachines = machines.nixos or { }; # Configuration helpers mkNixosHost = root: system: hostname: users: lib.nixosSystem { @@ -72,8 +119,8 @@ rec { modules = [ (root + "/configuration.nix") - inputs.home-manager.nixosModules.home-manager inputs.nur.nixosModules.nur + inputs.home-manager.nixosModules.home-manager { home-manager = { useGlobalPkgs = false; @@ -87,6 +134,9 @@ rec { }; }; } + { + networking.hostName = hostname; + } ] ++ (builtins.attrValues nixosModules); specialArgs = { @@ -166,7 +216,7 @@ rec { (builtins.attrValues (builtins.mapAttrs (system: hosts: - lib.attrsets.filterAttrs + lib.filterAttrs (host: config: config != null) (builtins.mapAttrs