refactor: unify evalClanService with evalService

This commit is contained in:
Johannes Kirschbauer
2025-06-26 14:50:35 +02:00
parent 1568950410
commit 11a94893fb
13 changed files with 97 additions and 101 deletions

View File

@@ -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 { };

View File

@@ -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 = [

View File

@@ -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 }:
# <lambda evalService>
{ 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;
}

View File

@@ -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
;
};
}

View File

@@ -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

View File

@@ -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)
];

View File

@@ -56,7 +56,7 @@ let
};
};
eval = clanLib.inventory.evalClanService {
eval = clanLib.evalService {
modules = [
(service-A)
];

View File

@@ -86,7 +86,7 @@ let
};
};
eval = clanLib.inventory.evalClanService {
eval = clanLib.evalService {
modules = [
(service-A)
];

View File

@@ -46,7 +46,7 @@ in
legacyPackages.clan-service-module-interface =
(pkgs.nixosOptionsDoc {
options =
(self.clanLib.inventory.evalClanService {
(self.clanLib.evalService {
modules = [ ];
prefix = [ ];
}).options;

View File

@@ -10,7 +10,7 @@ let
inspectModule =
inputName: moduleName: module:
let
eval = clanLib.inventory.evalClanService {
eval = clanLib.evalService {
modules = [ module ];
prefix = [
inputName