diff options
Diffstat (limited to 'vendor/aws/aws-sdk-php/src/ResultPaginator.php')
-rw-r--r-- | vendor/aws/aws-sdk-php/src/ResultPaginator.php | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/vendor/aws/aws-sdk-php/src/ResultPaginator.php b/vendor/aws/aws-sdk-php/src/ResultPaginator.php new file mode 100644 index 0000000..2c5ec5c --- /dev/null +++ b/vendor/aws/aws-sdk-php/src/ResultPaginator.php @@ -0,0 +1,174 @@ +<?php +namespace Aws; + +use GuzzleHttp\Promise; + +/** + * Iterator that yields each page of results of a pageable operation. + */ +class ResultPaginator implements \Iterator +{ + /** @var AwsClientInterface Client performing operations. */ + private $client; + + /** @var string Name of the operation being paginated. */ + private $operation; + + /** @var array Args for the operation. */ + private $args; + + /** @var array Configuration for the paginator. */ + private $config; + + /** @var Result Most recent result from the client. */ + private $result; + + /** @var string|array Next token to use for pagination. */ + private $nextToken; + + /** @var int Number of operations/requests performed. */ + private $requestCount = 0; + + /** + * @param AwsClientInterface $client + * @param string $operation + * @param array $args + * @param array $config + */ + public function __construct( + AwsClientInterface $client, + $operation, + array $args, + array $config + ) { + $this->client = $client; + $this->operation = $operation; + $this->args = $args; + $this->config = $config; + } + + /** + * Runs a paginator asynchronously and uses a callback to handle results. + * + * The callback should have the signature: function (Aws\Result $result). + * A non-null return value from the callback will be yielded by the + * promise. This means that you can return promises from the callback that + * will need to be resolved before continuing iteration over the remaining + * items, essentially merging in other promises to the iteration. The last + * non-null value returned by the callback will be the result that fulfills + * the promise to any downstream promises. + * + * @param callable $handleResult Callback for handling each page of results. + * The callback accepts the result that was + * yielded as a single argument. If the + * callback returns a promise, the promise + * will be merged into the coroutine. + * + * @return Promise\Promise + */ + public function each(callable $handleResult) + { + return Promise\Coroutine::of(function () use ($handleResult) { + $nextToken = null; + do { + $command = $this->createNextCommand($this->args, $nextToken); + $result = (yield $this->client->executeAsync($command)); + $nextToken = $this->determineNextToken($result); + $retVal = $handleResult($result); + if ($retVal !== null) { + yield Promise\Create::promiseFor($retVal); + } + } while ($nextToken); + }); + } + + /** + * Returns an iterator that iterates over the values of applying a JMESPath + * search to each result yielded by the iterator as a flat sequence. + * + * @param string $expression JMESPath expression to apply to each result. + * + * @return \Iterator + */ + public function search($expression) + { + // Apply JMESPath expression on each result, but as a flat sequence. + return flatmap($this, function (Result $result) use ($expression) { + return (array) $result->search($expression); + }); + } + + /** + * @return Result + */ + #[\ReturnTypeWillChange] + public function current() + { + return $this->valid() ? $this->result : false; + } + + #[\ReturnTypeWillChange] + public function key() + { + return $this->valid() ? $this->requestCount - 1 : null; + } + + #[\ReturnTypeWillChange] + public function next() + { + $this->result = null; + } + + #[\ReturnTypeWillChange] + public function valid() + { + if ($this->result) { + return true; + } + + if ($this->nextToken || !$this->requestCount) { + $this->result = $this->client->execute( + $this->createNextCommand($this->args, $this->nextToken) + ); + $this->nextToken = $this->determineNextToken($this->result); + $this->requestCount++; + return true; + } + + return false; + } + + #[\ReturnTypeWillChange] + public function rewind() + { + $this->requestCount = 0; + $this->nextToken = null; + $this->result = null; + } + + private function createNextCommand(array $args, array $nextToken = null) + { + return $this->client->getCommand($this->operation, array_merge($args, ($nextToken ?: []))); + } + + private function determineNextToken(Result $result) + { + if (!$this->config['output_token']) { + return null; + } + + if ($this->config['more_results'] + && !$result->search($this->config['more_results']) + ) { + return null; + } + + $nextToken = is_scalar($this->config['output_token']) + ? [$this->config['input_token'] => $this->config['output_token']] + : array_combine($this->config['input_token'], $this->config['output_token']); + + return array_filter(array_map(function ($outputToken) use ($result) { + return $result->search($outputToken); + }, $nextToken)); + } +} |