I’d like to set a “global” option from within a submodule, but the config
I return is grafted into the “global” under the submodule “path” rather than at the root… any idea if it’s somehow possible?
Er… I guess I didn’t make a great job at explaining what I want to do… Some code will hopefully help.
In mymodule.nix
I have:
{ lib, config, ... }: {
options.myoption = lib.mkOption {
type = lib.types.attrsOf (lib.types.submodule (
import ./mysubmodule.nix
));
};
}
and mysubmodule.nix
is:
{ name, lib, config, ... }: {
options.mysubmoduleoption = {
type = lib.types.str;
};
config = {
# here I want to set a "global" option, say "systemd.mounts"
# based on the value of "mymodule.name.mysubmoduleoption"
# but it seems I can only set values under "mymodule.name"
};
}
It doesn’t work like that. Submodules are for defining the type, so the only thing you get is interface (
options
), not implementation.Do that.
Also be aware that some use-cases might be covered by library functions such as
lib.flatMap
orlib.pipe
.You do get a functional
config
in submodules… try this (it doesn’t do anything so you can just import into anyconfiguration.nix
):{ config, lib, pkgs, modulesPath, specialArgs, options, ... }: { options.mynamespace = lib.mkOption { type = lib.types.attrsOf (lib.types.submodule ({name, config, ...}:{ options = { option1 = lib.mkOption { type = lib.types.str; default = ""; }; option2 = lib.mkOption { type = lib.types.str; default = ""; }; }; config = { option2 = "derived from value of option1: '${config.option1}'"; }; })); }; config = { mynamespace.submodule1.option1 = "value of option1"; fileSystems = builtins.trace (builtins.toJSON config.mynamespace) {}; }; }