plugins = array_flip($plugins); $this->isWhitelist = $whitelist; } /** * @return string[] */ public function getPlugins() : array{ return array_flip($this->plugins); } public function isWhitelist() : bool{ return $this->isWhitelist; } /** * Returns whether the given name is permitted by this graylist. */ public function isAllowed(string $name) : bool{ return $this->isWhitelist() === isset($this->plugins[$name]); } /** * @param mixed[] $array */ public static function fromArray(array $array) : PluginGraylist{ if(!isset($array["mode"]) || ($array["mode"] !== "whitelist" && $array["mode"] !== "blacklist")){ throw new \InvalidArgumentException("\"mode\" must be set"); } $isWhitelist = match($array["mode"]){ "whitelist" => true, "blacklist" => false, default => throw new \InvalidArgumentException("\"mode\" must be either \"whitelist\" or \"blacklist\"") }; $plugins = []; if(isset($array["plugins"])){ if(!is_array($array["plugins"])){ throw new \InvalidArgumentException("\"plugins\" must be an array"); } foreach($array["plugins"] as $k => $v){ if(!is_string($v) && !is_int($v) && !is_float($v)){ throw new \InvalidArgumentException("\"plugins\" contains invalid element at position $k"); } $plugins[] = (string) $v; } } return new PluginGraylist($plugins, $isWhitelist); } /** * @return mixed[] * @phpstan-return array */ public function toArray() : array{ return [ "mode" => $this->isWhitelist ? 'whitelist' : 'blacklist', "plugins" => $this->plugins ]; } }