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" 
};

}
  • gompOP
    link
    fedilink
    arrow-up
    2
    ·
    1 year ago

    Submodules are for defining the type, so the only thing you get is interface (options), not implementation.

    You do get a functional config in submodules… try this (it doesn’t do anything so you can just import into any configuration.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) {};
    
      };
    
    }