diff --git a/modules/clan/module.nix b/modules/clan/module.nix index d3db7cbf9..3c587d4cf 100644 --- a/modules/clan/module.nix +++ b/modules/clan/module.nix @@ -229,11 +229,8 @@ in }; imports = [ ../inventoryClass/default.nix - (lib.modules.importApply ../inventoryClass/service-list-from-inputs.nix { - inherit flakeInputs clanLib; - }) { - inherit inventory directory; + inherit inventory directory flakeInputs; } ( let @@ -252,7 +249,6 @@ in machines = config.distributedServices.allMachines; } ) - ../inventoryClass/inventory-introspection.nix ]; }; diff --git a/modules/inventoryClass/default.nix b/modules/inventoryClass/default.nix index a680b5607..a618f95d2 100644 --- a/modules/inventoryClass/default.nix +++ b/modules/inventoryClass/default.nix @@ -1,10 +1,38 @@ -{ lib, clanLib, config, ... }: +{ + lib, + clanLib, + config, + ... +}: let inherit (lib) types mkOption; submodule = m: types.submoduleWith { modules = [ m ]; }; + + inspectModule = + inputName: moduleName: module: + let + eval = clanLib.evalService { + modules = [ module ]; + prefix = [ + inputName + "clan" + "modules" + moduleName + ]; + }; + in + { + manifest = eval.config.manifest; + roles = lib.mapAttrs (_n: v: { inherit (v) description; }) eval.config.roles; + }; + in { options = { + flakeInputs = mkOption { + type = types.raw; + }; + directory = mkOption { type = types.path; }; @@ -35,5 +63,50 @@ in "services" ]; }; + + staticModules = lib.mkOption { + readOnly = true; + type = lib.types.raw; + + apply = moduleSet: lib.mapAttrs (inspectModule "") moduleSet; + }; + modulesPerSource = lib.mkOption { + # { sourceName :: { moduleName :: {} }} + readOnly = true; + type = lib.types.raw; + default = + let + inputsWithModules = lib.filterAttrs (_inputName: v: v ? clan.modules) config.flakeInputs; + in + lib.mapAttrs ( + inputName: v: lib.mapAttrs (inspectModule inputName) v.clan.modules + ) inputsWithModules; + }; + moduleSchemas = lib.mkOption { + # { sourceName :: { moduleName :: { roleName :: Schema }}} + readOnly = true; + type = lib.types.raw; + default = lib.mapAttrs ( + _inputName: moduleSet: + lib.mapAttrs ( + _moduleName: module: + (clanLib.evalService { + modules = [ module ]; + prefix = [ ]; + }).config.result.api.schema + ) moduleSet + ) config.modulesPerSource; + }; + templatesPerSource = lib.mkOption { + # { sourceName :: { moduleName :: {} }} + readOnly = true; + type = lib.types.raw; + default = + let + inputsWithTemplates = lib.filterAttrs (_inputName: v: v ? clan.templates) config.flakeInputs; + in + lib.mapAttrs (_inputName: v: lib.mapAttrs (_n: t: t) v.clan.templates) inputsWithTemplates; + + }; }; }