self::DEFAULT_OP, "isop" => self::DEFAULT_OP, "operator" => self::DEFAULT_OP, "isoperator" => self::DEFAULT_OP, "admin" => self::DEFAULT_OP, "isadmin" => self::DEFAULT_OP, "!op" => self::DEFAULT_NOT_OP, "notop" => self::DEFAULT_NOT_OP, "!operator" => self::DEFAULT_NOT_OP, "notoperator" => self::DEFAULT_NOT_OP, "!admin" => self::DEFAULT_NOT_OP, "notadmin" => self::DEFAULT_NOT_OP, "true" => self::DEFAULT_TRUE, "false" => self::DEFAULT_FALSE, ]; private const KEY_DEFAULT = "default"; private const KEY_CHILDREN = "children"; private const KEY_DESCRIPTION = "description"; /** * @throws PermissionParserException */ public static function defaultFromString(bool|string $value) : string{ if(is_bool($value)){ return $value ? self::DEFAULT_TRUE : self::DEFAULT_FALSE; } $lower = strtolower($value); if(isset(self::DEFAULT_STRING_MAP[$lower])){ return self::DEFAULT_STRING_MAP[$lower]; } throw new PermissionParserException("Unknown permission default name \"$value\""); } /** * @param mixed[][] $data * @phpstan-param array> $data * * @return Permission[][] * @phpstan-return array> * @throws PermissionParserException */ public static function loadPermissions(array $data, string $default = self::DEFAULT_FALSE) : array{ $result = []; foreach(Utils::stringifyKeys($data) as $name => $entry){ $desc = null; if(isset($entry[self::KEY_DEFAULT])){ $default = PermissionParser::defaultFromString($entry[self::KEY_DEFAULT]); } if(isset($entry[self::KEY_CHILDREN])){ throw new PermissionParserException("Nested permission declarations are no longer supported. Declare each permission separately."); } if(isset($entry[self::KEY_DESCRIPTION])){ $desc = $entry[self::KEY_DESCRIPTION]; } $result[$default][] = new Permission($name, $desc); } return $result; } }