setEndpoint($endpoint); $this->setAttributes($attributes); } elseif (\is_array($endpoint)) { $query = array_shift($endpoint); $this->setEndpoint($query); $this->setAttributes($endpoint); } else { throw new QueryException('Specified endpoint is not correct'); } } const AVAILABLE_OPERATORS = [ '-', // Does not have '=', // Equal '>', // More than '<' // Less than ]; /** * Where logic of query * * @param string $key * @param bool $value * @param string|null $operator * @return \RouterOS\Query * @throws \RouterOS\Exceptions\ClientException * @since 1.0.0 */ public function where(string $key, $value = true, string $operator = ''): self { if (!empty($operator)) { // If operator is available in list if (\in_array($operator, self::AVAILABLE_OPERATORS, true)) { // Overwrite key $key = $operator . $key; } else { throw new ClientException('Operator "' . $operator . '" in not in allowed list [' . implode(',', self::AVAILABLE_OPERATORS) . ']'); } } $this->add('?' . $key . '=' . $value); return $this; } /** * Append additional operations * * @param string $operations * @return \RouterOS\Query * @since 1.0.0 */ public function operations(string $operations): self { $this->_operations = '?#' . $operations; return $this; } /** * Append tag to query (it should be at end) * * @param string $name * @return \RouterOS\Query * @since 1.0.0 */ public function tag(string $name): self { $this->_tag = '.tag=' . $name; return $this; } /** * Append to array yet another attribute of query * * @param string $word * @return \RouterOS\Query */ public function add(string $word): Query { $this->_attributes[] = $word; return $this; } /** * Get attributes array of current query * * @return array */ public function getAttributes(): array { return $this->_attributes; } /** * Set array of attributes * * @param array $attributes * @return \RouterOS\Query * @since 0.7 */ public function setAttributes(array $attributes): Query { $this->_attributes = $attributes; return $this; } /** * Get endpoint of current query * * @return string|null */ public function getEndpoint() { return $this->_endpoint; } /** * Set endpoint of query * * @param string|null $endpoint * @return \RouterOS\Query * @since 0.7 */ public function setEndpoint(string $endpoint = null): Query { $this->_endpoint = $endpoint; return $this; } /** * Build body of query * * @return array * @throws \RouterOS\Exceptions\QueryException */ public function getQuery(): array { if ($this->_endpoint === null) { throw new QueryException('Endpoint of query is not set'); } // Get all attributes and prepend endpoint to this list $attributes = $this->getAttributes(); array_unshift($attributes, $this->_endpoint); // If operations is set then add to query if (is_string($this->_operations) && !empty($this->_operations)) { $attributes[] = $this->_operations; } // If tag is set then added to query if (is_string($this->_tag) && !empty($this->_tag)) { $attributes[] = $this->_tag; } return $attributes; } }