10, ]; /** * @param string $url * @return void */ public function setUrl(string $url) { $this->data[ self::URL ] = $url; } /** * @return array * @throws OptionsException */ public function getUrl(): array { $url = $this->data[ self::URL ]; $parse = parse_url($url); if (!isset($parse['host'], $parse['port'])) { throw new OptionsException('url fail miss host or port'); } if (!isset($parse['scheme'])) { $parse['scheme'] = 'pulsar'; } $parse['scheme'] = strtolower($parse['scheme']); $parse['url'] = $url; return $parse; } /** * @param Authentication $authentication * @return void */ public function setAuthentication(Authentication $authentication) { $this->data[ self::Authentication ] = $authentication; } /** * @param int $seconds * @return void */ public function setConnectTimeout(int $seconds) { $this->data[ self::CONNECT_TIMEOUT ] = $seconds; } /** * @param string $topic * @return void */ public function setTopic(string $topic) { $this->data[ self::TOPIC ] = $topic; } /** * @return string * @throws OptionsException */ public function getTopic(): string { $topic = trim($this->data[ Options::TOPIC ] ?? ''); if (empty($topic)) { throw new OptionsException('topic is required'); } $parts = explode('/', $topic); if (count($parts) < 5) { throw new OptionsException('topic is format [persistent://tenant/namespace/topic]'); } if (empty($parts[4])) { throw new OptionsException('topic is empty'); } return $topic; } /** * @return array */ public function all(): array { return $this->data; } /** * @param $offset * @return bool */ public function offsetExists($offset): bool { return isset($this->data[ $offset ]); } /** * @param $offset * @return mixed|null */ public function offsetGet($offset) { return $this->data[ $offset ] ?? null; } /** * @param $offset * @param $value * @return void */ public function offsetSet($offset, $value) { $this->data[ $offset ] = $value; } /** * @param $offset * @return void * @throws OptionsException */ public function offsetUnset($offset) { throw new OptionsException('Prohibit deletion'); } }