lib/jsonschema: render defaults for submodule options

this relaxes the constraint that options of type `submodule` are always
required, and will render benign default values.
This commit is contained in:
Valentin Gagarin
2025-04-16 16:44:56 +02:00
committed by Valentin Gagarin
parent 9f7e9ca9df
commit 6a2e81373c
4 changed files with 41 additions and 2 deletions

View File

@@ -425,7 +425,19 @@ rec {
# return jsonschema property definition for submodule
# then (lib.attrNames (option.type.getSubOptions option.loc).opt)
then
exposedModuleInfo // example // description // parseSubOptions { inherit option; }
(lib.recursiveUpdate exposedModuleInfo (
if (default ? default) then
default
else
{
"$exportedModuleInfo" = {
required = true;
};
}
))
// example
// description
// parseSubOptions { inherit option; }
# throw error if option type is not supported
else
notSupported option;

View File

@@ -20,7 +20,7 @@
default = false;
description = "Is the user an admin?";
};
# a submodule option
# a submodule option without default
services = lib.mkOption {
type = lib.types.submodule {
options.opt = lib.mkOption {
@@ -30,6 +30,17 @@
};
};
};
# a submodule option with default
programs = lib.mkOption {
type = lib.types.submodule {
options.opt = lib.mkOption {
type = lib.types.str;
default = "bar";
description = "Another submodule option";
};
};
default = { };
};
# attrs of int
userIds = lib.mkOption {
type = lib.types.attrsOf lib.types.int;

View File

@@ -92,6 +92,20 @@
}
}
},
"programs": {
"$exportedModuleInfo": { "path": ["programs"] },
"type": "object",
"additionalProperties": false,
"properties": {
"opt": {
"$exportedModuleInfo": { "path": ["programs", "opt"] },
"type": "string",
"default": "bar",
"description": "Another submodule option"
}
},
"default": {}
},
"destinations": {
"$exportedModuleInfo": { "path": ["destinations"] },
"additionalProperties": {

View File

@@ -324,6 +324,7 @@ in
};
};
};
default = { };
};
};
@@ -354,6 +355,7 @@ in
};
};
};
default = { };
required = [ "opt" ];
};
};