summaryrefslogtreecommitdiff
path: root/server/vendor/php-opencloud/common/src/Common/Resource/Iterator.php
diff options
context:
space:
mode:
authormanzerbredes <loic.guegan_secondary@yahoo.fr>2016-03-15 16:17:39 +0100
committermanzerbredes <loic.guegan_secondary@yahoo.fr>2016-03-15 16:17:39 +0100
commit26d10bc0fa4befbac54453228ae1ce89021bdec2 (patch)
tree029d7240ecf7416205e5f76cf9107a6b5bdf8ca3 /server/vendor/php-opencloud/common/src/Common/Resource/Iterator.php
parent8ad216dedf017f3d6de047a25d08db3b98e16361 (diff)
parent03ef74d0cfe675a6e18a91f039182ca1b248d8f5 (diff)
Merge branch 'develop' into loic
Diffstat (limited to 'server/vendor/php-opencloud/common/src/Common/Resource/Iterator.php')
-rw-r--r--server/vendor/php-opencloud/common/src/Common/Resource/Iterator.php97
1 files changed, 97 insertions, 0 deletions
diff --git a/server/vendor/php-opencloud/common/src/Common/Resource/Iterator.php b/server/vendor/php-opencloud/common/src/Common/Resource/Iterator.php
new file mode 100644
index 0000000..63d4455
--- /dev/null
+++ b/server/vendor/php-opencloud/common/src/Common/Resource/Iterator.php
@@ -0,0 +1,97 @@
+<?php
+
+namespace OpenCloud\Common\Resource;
+
+use OpenCloud\Common\Transport\Utils;
+
+class Iterator
+{
+ private $requestFn;
+ private $resourceFn;
+ private $limit;
+ private $count;
+ private $resourcesKey;
+ private $markerKey;
+ private $mapFn;
+ private $currentMarker;
+
+ public function __construct(array $options, callable $requestFn, callable $resourceFn)
+ {
+ $this->limit = isset($options['limit']) ? $options['limit'] : false;
+ $this->count = 0;
+
+ if (isset($options['resourcesKey'])) {
+ $this->resourcesKey = $options['resourcesKey'];
+ }
+
+ if (isset($options['markerKey'])) {
+ $this->markerKey = $options['markerKey'];
+ }
+
+ if (isset($options['mapFn']) && is_callable($options['mapFn'])) {
+ $this->mapFn = $options['mapFn'];
+ }
+
+ $this->requestFn = $requestFn;
+ $this->resourceFn = $resourceFn;
+ }
+
+ private function fetchResources()
+ {
+ if ($this->shouldNotSendAnotherRequest()) {
+ return false;
+ }
+
+ $response = call_user_func($this->requestFn, $this->currentMarker);
+
+ $json = Utils::flattenJson(Utils::jsonDecode($response), $this->resourcesKey);
+
+ if ($response->getStatusCode() === 204 || empty($json)) {
+ return false;
+ }
+
+ return $json;
+ }
+
+ private function assembleResource(array $data)
+ {
+ $resource = call_user_func($this->resourceFn, $data);
+
+ // Invoke user-provided fn if provided
+ if ($this->mapFn) {
+ call_user_func_array($this->mapFn, [&$resource]);
+ }
+
+ // Update marker if operation supports it
+ if ($this->markerKey) {
+ $this->currentMarker = $resource->{$this->markerKey};
+ }
+
+ return $resource;
+ }
+
+ private function totalReached()
+ {
+ return $this->limit && $this->count >= $this->limit;
+ }
+
+ private function shouldNotSendAnotherRequest()
+ {
+ return $this->totalReached() || ($this->count > 0 && !$this->markerKey);
+ }
+
+ public function __invoke()
+ {
+ while ($resources = $this->fetchResources()) {
+ foreach ($resources as $resourceData) {
+ if ($this->totalReached()) {
+ break;
+ }
+
+ $this->count++;
+
+ yield $this->assembleResource($resourceData);
+ }
+ }
+ }
+}