{ lib, ... }: { loadHosts = hostsPath: let rakeLeaves = dirPath: # Adapted from digga (https://github.com/divnix/digga/blob/main/src/importers.nix) # This version does not support nested hosts; your host derivation must either reside in hosts/<hostname>.nix or hosts/<hostname>/default.nix let seive = file: type: (type == "regular" && lib.hasSuffix ".nix" file) || (type == "directory"); collect = file: type: { name = lib.removeSuffix ".nix" file; value = let path = dirPath + "/${file}"; in if (type == "regular") || (type == "directory" && builtins.pathExists (path + "/default.nix")) then path else throw "Your host must be a file named <hostname>.nix or a directory named <hostname> with a default.nix file in it"; }; files = lib.filterAttrs seive (builtins.readDir dirPath); in lib.filterAttrs (n: v: v != {}) (lib.mapAttrs' collect files); in { nixosConfigurations = lib.mapAttrs (name: value: import value { utils = import ./. { inherit lib; }; } ) (rakeLeaves hostsPath); }; }