{ lib, self }: let inherit (lib) filterAttrs hasSuffix mapAttrs mapAttrs' mkOption nameValuePair removeSuffix types ; registryName = fileName: removeSuffix ".nix" fileName; registryOption = registry: mkOption { type = types.attrsOf (types.attrsOf registry.type); default = { }; description = '' Lazily collected fleet-visible registry entries, nested by host and entry name. ''; }; definitions = mapAttrs' ( name: type: let path = self + "/registry/${name}"; in nameValuePair (registryName name) (import path { inherit lib; }) ) (filterAttrs (name: type: type == "regular" && hasSuffix ".nix" name) (builtins.readDir (self + "/registry"))); join = registry: host: entry: filterAttrs (_name: value: value != null) ( mapAttrs (registryName: _registry: (registry.${registryName}.${host} or { }).${entry} or null) definitions ); collectData = { hosts }: mapAttrs ( registryName: _registry: mapAttrs (hostName: host: host.config.registry.${registryName}.${hostName} or { }) hosts ) definitions; withOperations = registry: registry // { join = host: entry: join registry host entry; }; in { inherit definitions; module = { options.registry = mapAttrs (_name: registry: registryOption registry) definitions; }; collect = args: withOperations (collectData args); }