lib/types: Allow paths as submodule values

Changed files
+8 -6
lib
nixos
doc
manual
development
+5 -3
lib/types.nix
···
else unify (if shorthandOnlyDefinesConfig then { config = value; } else value);
allModules = defs: modules ++ imap1 (n: { value, file }:
-
# Annotate the value with the location of its definition for better error messages
-
coerce (lib.modules.unifyModuleSyntax file "${toString file}-${toString n}") value
+
if isAttrs value || isFunction value then
+
# Annotate the value with the location of its definition for better error messages
+
coerce (lib.modules.unifyModuleSyntax file "${toString file}-${toString n}") value
+
else value
) defs;
in
mkOptionType rec {
name = "submodule";
-
check = x: isAttrs x || isFunction x;
+
check = x: isAttrs x || isFunction x || path.check x;
merge = loc: defs:
(evalModules {
modules = allModules defs;
+3 -3
nixos/doc/manual/development/option-types.xml
···
<listitem>
<para>
A set of sub options <replaceable>o</replaceable>.
-
<replaceable>o</replaceable> can be an attribute set or a function
-
returning an attribute set. Submodules are used in composed types to
-
create modular options. This is equivalent to
+
<replaceable>o</replaceable> can be an attribute set, a function
+
returning an attribute set, or a path to a file containing such a value. Submodules are used in
+
composed types to create modular options. This is equivalent to
<literal>types.submoduleWith { modules = toList o; shorthandOnlyDefinesConfig = true; }</literal>.
Submodules are detailed in
<xref