{ lib, config, ... }: let inherit (lib) mkOption types mkMerge mapAttrsToList mkBefore; in { options.my.apps = mkOption { type = types.attrsOf (types.submodule ({ name, ... }: { options = { resourceName = mkOption { type = types.str; default = "app_${name}"; internal = true; }; policy = mkOption { type = types.lines; }; }; config = { policy = mkBefore '' path "kv/data/apps/${name}" { capabilities = ["read"] } path "kv/metadata/apps/${name}" { capabilities = ["read"] } ''; }; })); }; config.resource = mkMerge (mapAttrsToList (appName: appCfg: { vault_policy.${appCfg.resourceName} = { name = "app/${appName}"; policy = appCfg.policy; }; }) config.my.apps); }