ok
Direktori : /home2/selectio/www/fms-worksuite/vendor/m4tthumphrey/php-gitlab-api/src/ |
Current File : /home2/selectio/www/fms-worksuite/vendor/m4tthumphrey/php-gitlab-api/src/ResultPager.php |
<?php declare(strict_types=1); /* * This file is part of the Gitlab API library. * * (c) Matt Humphrey <matth@windsor-telecom.co.uk> * (c) Graham Campbell <hello@gjcampbell.co.uk> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Gitlab; use Closure; use Generator; use Gitlab\Api\AbstractApi; use Gitlab\Exception\RuntimeException; use Gitlab\HttpClient\Message\ResponseMediator; use ValueError; /** * This is the result pager class. * * @author Ramon de la Fuente <ramon@future500.nl> * @author Mitchel Verschoof <mitchel@future500.nl> * @author Graham Campbell <hello@gjcampbell.co.uk> */ final class ResultPager implements ResultPagerInterface { /** * The default number of entries to request per page. * * @var int */ private const PER_PAGE = 50; /** * The client to use for pagination. * * @var Client */ private $client; /** * The number of entries to request per page. * * @var int */ private $perPage; /** * The pagination result from the API. * * @var array<string,string> */ private $pagination; /** * Create a new result pager instance. * * @param Client $client * @param int|null $perPage * * @return void */ public function __construct(Client $client, int $perPage = null) { if (null !== $perPage && ($perPage < 1 || $perPage > 100)) { throw new ValueError(\sprintf('%s::__construct(): Argument #2 ($perPage) must be between 1 and 100, or null', self::class)); } $this->client = $client; $this->perPage = $perPage ?? self::PER_PAGE; $this->pagination = []; } /** * Fetch a single result from an api call. * * @param AbstractApi $api * @param string $method * @param array $parameters * * @throws \Http\Client\Exception * * @return array */ public function fetch(AbstractApi $api, string $method, array $parameters = []): array { $result = self::bindPerPage($api, $this->perPage)->$method(...$parameters); if (!\is_array($result)) { throw new RuntimeException('Pagination of this endpoint is not supported.'); } $this->postFetch(); return $result; } /** * Fetch all results from an api call. * * @param AbstractApi $api * @param string $method * @param array $parameters * * @throws \Http\Client\Exception * * @return array */ public function fetchAll(AbstractApi $api, string $method, array $parameters = []): array { return \iterator_to_array($this->fetchAllLazy($api, $method, $parameters)); } /** * Lazily fetch all results from an api call. * * @param AbstractApi $api * @param string $method * @param array $parameters * * @throws \Http\Client\Exception * * @return \Generator */ public function fetchAllLazy(AbstractApi $api, string $method, array $parameters = []): Generator { /** @var mixed $value */ foreach ($this->fetch($api, $method, $parameters) as $value) { yield $value; } while ($this->hasNext()) { /** @var mixed $value */ foreach ($this->fetchNext() as $value) { yield $value; } } } /** * Check to determine the availability of a next page. * * @return bool */ public function hasNext(): bool { return isset($this->pagination['next']); } /** * Fetch the next page. * * @throws \Http\Client\Exception * * @return array */ public function fetchNext(): array { return $this->get('next'); } /** * Check to determine the availability of a previous page. * * @return bool */ public function hasPrevious(): bool { return isset($this->pagination['prev']); } /** * Fetch the previous page. * * @throws \Http\Client\Exception * * @return array */ public function fetchPrevious(): array { return $this->get('prev'); } /** * Fetch the first page. * * @throws \Http\Client\Exception * * @return array */ public function fetchFirst(): array { return $this->get('first'); } /** * Fetch the last page. * * @throws \Http\Client\Exception * * @return array */ public function fetchLast(): array { return $this->get('last'); } /** * Refresh the pagination property. * * @return void */ private function postFetch(): void { $response = $this->client->getLastResponse(); $this->pagination = null === $response ? [] : ResponseMediator::getPagination($response); } /** * @param string $key * * @throws \Http\Client\Exception * * @return array */ private function get(string $key): array { $pagination = $this->pagination[$key] ?? null; if (null === $pagination) { return []; } $result = $this->client->getHttpClient()->get($pagination); $content = ResponseMediator::getContent($result); if (!\is_array($content)) { throw new RuntimeException('Pagination of this endpoint is not supported.'); } $this->postFetch(); return $content; } /** * @param \Gitlab\Api\AbstractApi $api * @param int $perPage * * @return \Gitlab\Api\AbstractApi */ private static function bindPerPage(AbstractApi $api, int $perPage): AbstractApi { /** @var Closure(AbstractApi): AbstractApi */ $closure = Closure::bind(static function (AbstractApi $api) use ($perPage): AbstractApi { $clone = clone $api; $clone->perPage = $perPage; return $clone; }, null, AbstractApi::class); return $closure($api); } }