feat(services): init feature flags in the module manifest: 'manifest.features.API'

This commit is contained in:
Johannes Kirschbauer
2025-04-27 10:29:38 +02:00
parent ffa8257763
commit 8495106ec4
4 changed files with 60 additions and 13 deletions

View File

@@ -0,0 +1,35 @@
# This module enables itself if
# manifest.features.API = true
# It converts the roles.interface to a json-schema
{ clanLib }:
let
converter = clanLib.jsonschema {
includeDefaults = true;
};
in
{ lib, config, ... }:
{
options.result.api = lib.mkOption {
default = { };
type = lib.types.submodule (
lib.optionalAttrs config.manifest.features.API {
options.schema = lib.mkOption {
description = ''
The API schema for configuring the service.
Each 'role.<name>.interface' is converted to a json-schema.
This can be used to generate and type check the API relevant objects.
'';
defaultText = lib.literalExpression ''
{
peer = { $schema" = "http://json-schema.org/draft-07/schema#"; ... }
commuter = { $schema" = "http://json-schema.org/draft-07/schema#"; ... }
distributor = { $schema" = "http://json-schema.org/draft-07/schema#"; ... }
}
'';
default = lib.mapAttrs (_roleName: v: converter.parseModule v.interface) config.roles;
};
}
);
};
}

View File

@@ -126,6 +126,9 @@ let
./service-module.nix
# Import the resolved module.
(builtins.head instances).instance.resolvedModule
# feature modules
(lib.modules.importApply ./api-feature.nix { inherit clanLib; })
]
# Include all the instances that correlate to the resolved module
++ (builtins.map (v: {

View File

@@ -243,6 +243,28 @@ in
'';
type = types.str;
};
features = mkOption {
description = ''
Enable built-in features for the module
See the documentation for each feature:
- API
'';
type = types.submoduleWith {
modules = [
{
options.API = mkOption {
type = types.bool;
default = false;
description = ''
Enables automatic API schema conversion for the interface of this module.
'';
};
}
];
};
default = { };
};
};
}
];

View File

@@ -1,18 +1,5 @@
{ lib, ... }:
let
# {
# roles = {
# client = {
# machines = [
# "camina_machine"
# "vi_machine"
# ];
# };
# server = {
# machines = [ "vyr_machine" ];
# };
# };
# }
instanceOptions = lib.types.submodule {
options.roles = lib.mkOption {
description = ''