Feat(clan.service): require roles.interface to be json serializable
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
# This module enables itself if
|
||||
# manifest.features.API = true
|
||||
# It converts the roles.interface to a json-schema
|
||||
{ clanLib }:
|
||||
{ clanLib, attrName }:
|
||||
let
|
||||
converter = clanLib.jsonschema {
|
||||
includeDefaults = true;
|
||||
@@ -11,8 +11,7 @@ in
|
||||
{
|
||||
options.result.api = lib.mkOption {
|
||||
default = { };
|
||||
type = lib.types.submodule (
|
||||
lib.optionalAttrs config.manifest.features.API {
|
||||
type = lib.types.submodule ({
|
||||
options.schema = lib.mkOption {
|
||||
description = ''
|
||||
The API schema for configuring the service.
|
||||
@@ -29,20 +28,24 @@ in
|
||||
'';
|
||||
default = lib.mapAttrs (_roleName: v: converter.parseModule v.interface) config.roles;
|
||||
};
|
||||
}
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
config.result.assertions = lib.optionalAttrs (config.manifest.features.API) (
|
||||
config.result.assertions = (
|
||||
lib.mapAttrs' (roleName: _role: {
|
||||
name = "${roleName}";
|
||||
value = {
|
||||
# TODO: make the path to access the schema shorter
|
||||
message = ''
|
||||
`roles.${roleName}.interface` is not JSON serializable.
|
||||
|
||||
but 'manifest.features.API' is enabled, which requires all 'roles-interfaces' of this module to be a subset of JSON.
|
||||
'clan.services' modules require all 'roles.*.interfaces' to be subset of JSON.
|
||||
|
||||
clan.service module '${config.manifest.name}
|
||||
: clan.service module '${config.manifest.name}
|
||||
|
||||
To see the evaluation problem run
|
||||
|
||||
nix eval .#clanInternals.inventoryClass.distributedServices.importedModulesEvaluated.${attrName}.config.result.api.schema.${roleName}
|
||||
'';
|
||||
assertion = (builtins.tryEval (lib.deepSeq config.result.api.schema.${roleName} true)).success;
|
||||
};
|
||||
|
||||
@@ -118,7 +118,7 @@ let
|
||||
|
||||
# TODO: Eagerly check the _class of the resolved module
|
||||
importedModulesEvaluated = lib.mapAttrs (
|
||||
_module_ident: instances:
|
||||
module_ident: instances:
|
||||
(lib.evalModules {
|
||||
class = "clan.service";
|
||||
modules =
|
||||
@@ -128,7 +128,10 @@ let
|
||||
(builtins.head instances).instance.resolvedModule
|
||||
|
||||
# feature modules
|
||||
(lib.modules.importApply ./api-feature.nix { inherit clanLib; })
|
||||
(lib.modules.importApply ./api-feature.nix {
|
||||
inherit clanLib;
|
||||
attrName = module_ident;
|
||||
})
|
||||
]
|
||||
# Include all the instances that correlate to the resolved module
|
||||
++ (builtins.map (v: {
|
||||
|
||||
Reference in New Issue
Block a user