{ lib, config, options, ... }: let inherit (lib) types; in { imports = [ # fun..a ( { ... }: { options = { fun = lib.mkOption { type = types.functionTo (types.submodule { options.a = lib.mkOption { default = "a"; }; }); }; }; } ) # fun..b ( { ... }: { options = { fun = lib.mkOption { type = types.functionTo (types.submodule { options.b = lib.mkOption { default = "b"; }; }); }; }; } ) ]; options = { result = lib.mkOption { type = types.str; default = lib.concatStringsSep " " ( lib.attrValues (config.fun (throw "shouldn't use input param")) ); }; optionsResult = lib.mkOption { type = types.str; default = lib.concatStringsSep " " ( lib.concatLists ( lib.mapAttrsToList (k: v: if k == "_module" then [ ] else [ (lib.showOption v.loc) ]) ( (options.fun.type.getSubOptions [ "fun" ]) ) ) ); }; }; config.fun = lib.mkMerge [ (input: { b = "bee"; }) ]; }