inputs: { options.nixos.services.phpfpm = let inherit (inputs.lib) mkOption types; in { instances = mkOption { type = types.attrsOf (types.submodule (submoduleInputs: { options = { user = mkOption { type = types.nullOr types.nonEmptyStr; default = null; }; group = mkOption { type = types.nullOr types.nonEmptyStr; default = null; }; package = mkOption { type = types.nullOr types.package; default = null; }; };})); default = {}; }; }; config = let inherit (builtins) map listToAttrs filter; inherit (inputs.localLib) attrsToList; inherit (inputs.config.nixos.services) phpfpm; in { services.phpfpm.pools = listToAttrs (map (pool: { inherit (pool) name; value = rec { user = if pool.value.user == null then pool.name else pool.value.user; group = if pool.value.group == null then inputs.config.users.users.${user}.group else pool.value.group; phpPackage = if pool.value.package == null then inputs.pkgs.php else pool.value.package; settings = { "pm" = "ondemand"; "pm.max_children" = 4; "pm.process_idle_timeout" = "60s"; "pm.max_requests" = 128; }; }; }) (attrsToList phpfpm.instances)); users = { users = listToAttrs (map (pool: { inherit (pool) name; value = { isSystemUser = true; group = pool.name; }; }) (filter (pool: pool.value.user == null) (attrsToList phpfpm.instances))); groups = listToAttrs (map (pool: { inherit (pool) name; value = {}; }) (filter (pool: pool.value.user == null) (attrsToList phpfpm.instances))); }; }; }