From 9ef518fa206a6504e9e3b2547549572ffe85d75a Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Thu, 26 Jun 2025 14:50:35 +0200 Subject: [PATCH] refactor: unify evalClanService with evalService --- checks/flake-module.nix | 2 +- docs/nix/get-module-docs.nix | 2 +- docs/nix/options/flake-module.nix | 27 ++++---- lib/default.nix | 17 +---- lib/modules/inventory/default.nix | 2 +- .../distributed-service/evalService.nix | 30 +++++++++ .../distributed-service/inventory-adapter.nix | 63 +------------------ .../distributed-service/resolveModule.nix | 43 +++++++++++++ .../multi_import_duplication.nix | 4 +- .../tests/nested_services/multi_machine.nix | 2 +- .../tests/nested_services/simple.nix | 2 +- lib/modules/inventory/flake-module.nix | 2 +- .../service-list-from-inputs.nix | 2 +- 13 files changed, 97 insertions(+), 101 deletions(-) create mode 100644 lib/modules/inventory/distributed-service/evalService.nix create mode 100644 lib/modules/inventory/distributed-service/resolveModule.nix diff --git a/checks/flake-module.nix b/checks/flake-module.nix index 03f16db04..916d3b75a 100644 --- a/checks/flake-module.nix +++ b/checks/flake-module.nix @@ -81,7 +81,7 @@ in _n: m: let schema = - (self.clanLib.inventory.evalClanService { + (self.clanLib.evalService { modules = [ m ]; prefix = [ "checks" diff --git a/docs/nix/get-module-docs.nix b/docs/nix/get-module-docs.nix index 13cd80b43..9cb75e1a0 100644 --- a/docs/nix/get-module-docs.nix +++ b/docs/nix/get-module-docs.nix @@ -41,7 +41,7 @@ clanModulesViaService = lib.mapAttrs ( _moduleName: moduleValue: let - evaluatedService = clan-core.clanLib.inventory.evalClanService { + evaluatedService = clan-core.clanLib.evalService { modules = [ moduleValue ]; prefix = [ ]; }; diff --git a/docs/nix/options/flake-module.nix b/docs/nix/options/flake-module.nix index bbfa17476..216445778 100644 --- a/docs/nix/options/flake-module.nix +++ b/docs/nix/options/flake-module.nix @@ -23,22 +23,19 @@ baseHref = "/options-page/"; - evalService = - serviceModule: - lib.evalModules { - modules = [ - { - imports = [ - serviceModule - ../../../lib/modules/inventory/distributed-service/service-module.nix - ]; - } - ]; - }; + getRoles = + module: + (clanLib.evalService { + modules = [ module ]; + prefix = [ ]; + }).config.roles; - getRoles = module: (evalService module).config.roles; - - getManifest = module: (evalService module).config.manifest; + getManifest = + module: + (clanLib.evalService { + modules = [ module ]; + prefix = [ ]; + }).config.manifest; loadFile = file: if builtins.pathExists file then builtins.readFile file else ""; diff --git a/lib/default.nix b/lib/default.nix index 073c6407f..36cd614ef 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -20,22 +20,7 @@ lib.fix (clanLib: { clan-core = self; inherit nixpkgs nix-darwin; }; - evalServiceSchema = - self: - { - moduleSpec, - flakeInputs ? self.inputs, - localModuleSet ? self.clan.modules, - }: - let - resolvedModule = clanLib.inventory.resolveModule { - inherit moduleSpec flakeInputs localModuleSet; - }; - in - (clanLib.inventory.evalClanService { - modules = [ resolvedModule ]; - prefix = [ ]; - }).config.result.api.schema; + evalService = clanLib.callLib ./modules/inventory/distributed-service/evalService.nix { }; # ------------------------------------ # ClanLib functions evalClan = clanLib.callLib ./modules/inventory/eval-clan-modules { }; diff --git a/lib/modules/inventory/default.nix b/lib/modules/inventory/default.nix index 9fcb8be51..4509fd074 100644 --- a/lib/modules/inventory/default.nix +++ b/lib/modules/inventory/default.nix @@ -3,7 +3,7 @@ let services = clanLib.callLib ./distributed-service/inventory-adapter.nix { }; in { - inherit (services) evalClanService mapInstances resolveModule; + inherit (services) mapInstances; interface = { _file = "clanLib.inventory.interface"; imports = [ diff --git a/lib/modules/inventory/distributed-service/evalService.nix b/lib/modules/inventory/distributed-service/evalService.nix new file mode 100644 index 000000000..320678f7e --- /dev/null +++ b/lib/modules/inventory/distributed-service/evalService.nix @@ -0,0 +1,30 @@ +/* + Example usage: + + ```nix + evalService = import /this/file.nix { inherit lib clanLib; }; + result = evalService { modules = []; prefix = []; }; + + => result.config + => result.options + ``` +*/ +{ lib, clanLib }: +# +{ modules, prefix }: +lib.evalModules { + class = "clan.service"; + specialArgs._ctx = prefix; + modules = + [ + # Base module + ./service-module.nix + # Feature modules + (lib.modules.importApply ./api-feature.nix { + inherit clanLib prefix; + }) + ] + ++ + # Modules of caller + modules; +} diff --git a/lib/modules/inventory/distributed-service/inventory-adapter.nix b/lib/modules/inventory/distributed-service/inventory-adapter.nix index 833702e54..95fdc0ccf 100644 --- a/lib/modules/inventory/distributed-service/inventory-adapter.nix +++ b/lib/modules/inventory/distributed-service/inventory-adapter.nix @@ -15,67 +15,9 @@ ... }: let - evalClanService = - { modules, prefix }: - (lib.evalModules { - class = "clan.service"; - specialArgs._ctx = prefix; - modules = [ - ./service-module.nix - # feature modules - (lib.modules.importApply ./api-feature.nix { - inherit clanLib prefix; - }) - ] ++ modules; - }); - - resolveModule = - { - moduleSpec, - flakeInputs, - localModuleSet, - }: - let - # TODO: - resolvedModuleSet = - # If the module.name is self then take the modules defined in the flake - # Otherwise its an external input which provides the modules via 'clan.modules' attribute - if moduleSpec.input == null then - localModuleSet - else - let - input = - flakeInputs.${moduleSpec.input} or (throw '' - Flake doesn't provide input with name '${moduleSpec.input}' - - Choose one of the following inputs: - - ${ - builtins.concatStringsSep "\n- " ( - lib.attrNames (lib.filterAttrs (_name: input: input ? clan) flakeInputs) - ) - } - - To import a local module from 'clan.modules' remove the 'input' attribute from the module definition - Remove the following line from the module definition: - - ... - - module.input = "${moduleSpec.input}" - - ''); - clanAttrs = - input.clan - or (throw "It seems the flake input ${moduleSpec.input} doesn't export any clan resources"); - in - clanAttrs.modules; - - resolvedModule = - resolvedModuleSet.${moduleSpec.name} - or (throw "flake doesn't provide clan-module with name ${moduleSpec.name}"); - in - resolvedModule; + resolveModule = import ./resolveModule.nix { inherit lib; }; in { - inherit evalClanService resolveModule; mapInstances = { # This is used to resolve the module imports from 'flake.inputs' @@ -151,7 +93,7 @@ in # TODO: Eagerly check the _class of the resolved module importedModulesEvaluated = lib.mapAttrs ( module_ident: instances: - evalClanService { + clanLib.evalService { prefix = prefix ++ [ module_ident ]; modules = [ @@ -201,5 +143,4 @@ in importedModulesEvaluated ; }; - } diff --git a/lib/modules/inventory/distributed-service/resolveModule.nix b/lib/modules/inventory/distributed-service/resolveModule.nix new file mode 100644 index 000000000..14ed86684 --- /dev/null +++ b/lib/modules/inventory/distributed-service/resolveModule.nix @@ -0,0 +1,43 @@ +{ lib }: +{ + moduleSpec, + flakeInputs, + localModuleSet, +}: +let + resolvedModuleSet = + # If the module.name is self then take the modules defined in the flake + # Otherwise its an external input which provides the modules via 'clan.modules' attribute + if moduleSpec.input == null then + localModuleSet + else + let + input = + flakeInputs.${moduleSpec.input} or (throw '' + Flake doesn't provide input with name '${moduleSpec.input}' + + Choose one of the following inputs: + - ${ + builtins.concatStringsSep "\n- " ( + lib.attrNames (lib.filterAttrs (_name: input: input ? clan) flakeInputs) + ) + } + + To import a local module from 'clan.modules' remove the 'input' attribute from the module definition + Remove the following line from the module definition: + + ... + - module.input = "${moduleSpec.input}" + + ''); + clanAttrs = + input.clan + or (throw "It seems the flake input ${moduleSpec.input} doesn't export any clan resources"); + in + clanAttrs.modules; + + resolvedModule = + resolvedModuleSet.${moduleSpec.name} + or (throw "flake doesn't provide clan-module with name ${moduleSpec.name}"); +in +resolvedModule diff --git a/lib/modules/inventory/distributed-service/tests/nested_services/multi_import_duplication.nix b/lib/modules/inventory/distributed-service/tests/nested_services/multi_import_duplication.nix index 2d5184e78..b1ca466be 100644 --- a/lib/modules/inventory/distributed-service/tests/nested_services/multi_import_duplication.nix +++ b/lib/modules/inventory/distributed-service/tests/nested_services/multi_import_duplication.nix @@ -82,13 +82,13 @@ let }; }; - eval = clanLib.inventory.evalClanService { + eval = clanLib.evalService { modules = [ (consumer-A) ]; prefix = [ ]; }; - eval2 = clanLib.inventory.evalClanService { + eval2 = clanLib.evalService { modules = [ (consumer-B) ]; diff --git a/lib/modules/inventory/distributed-service/tests/nested_services/multi_machine.nix b/lib/modules/inventory/distributed-service/tests/nested_services/multi_machine.nix index 520a41941..b1fd121e9 100644 --- a/lib/modules/inventory/distributed-service/tests/nested_services/multi_machine.nix +++ b/lib/modules/inventory/distributed-service/tests/nested_services/multi_machine.nix @@ -56,7 +56,7 @@ let }; }; - eval = clanLib.inventory.evalClanService { + eval = clanLib.evalService { modules = [ (service-A) ]; diff --git a/lib/modules/inventory/distributed-service/tests/nested_services/simple.nix b/lib/modules/inventory/distributed-service/tests/nested_services/simple.nix index 2e1e58492..074d50eba 100644 --- a/lib/modules/inventory/distributed-service/tests/nested_services/simple.nix +++ b/lib/modules/inventory/distributed-service/tests/nested_services/simple.nix @@ -86,7 +86,7 @@ let }; }; - eval = clanLib.inventory.evalClanService { + eval = clanLib.evalService { modules = [ (service-A) ]; diff --git a/lib/modules/inventory/flake-module.nix b/lib/modules/inventory/flake-module.nix index 1c62a0cf0..c52abbd24 100644 --- a/lib/modules/inventory/flake-module.nix +++ b/lib/modules/inventory/flake-module.nix @@ -46,7 +46,7 @@ in legacyPackages.clan-service-module-interface = (pkgs.nixosOptionsDoc { options = - (self.clanLib.inventory.evalClanService { + (self.clanLib.evalService { modules = [ ]; prefix = [ ]; }).options; diff --git a/lib/modules/inventoryClass/service-list-from-inputs.nix b/lib/modules/inventoryClass/service-list-from-inputs.nix index 07659cc67..a73d9c87a 100644 --- a/lib/modules/inventoryClass/service-list-from-inputs.nix +++ b/lib/modules/inventoryClass/service-list-from-inputs.nix @@ -10,7 +10,7 @@ let inspectModule = inputName: moduleName: module: let - eval = clanLib.inventory.evalClanService { + eval = clanLib.evalService { modules = [ module ]; prefix = [ inputName