summaryrefslogtreecommitdiff
path: root/vendor/league/uri/src/UriTemplate/VariableBag.php
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2022-12-13 20:00:46 +0300
committerAndrew Dolgov <[email protected]>2022-12-13 20:00:46 +0300
commit0226e0ca0dc70f9a0310b3eef045ee1c1e0ca3ac (patch)
tree254c0e880693c2636107308b5931951cfa501311 /vendor/league/uri/src/UriTemplate/VariableBag.php
split into a separate repo
Diffstat (limited to 'vendor/league/uri/src/UriTemplate/VariableBag.php')
-rw-r--r--vendor/league/uri/src/UriTemplate/VariableBag.php114
1 files changed, 114 insertions, 0 deletions
diff --git a/vendor/league/uri/src/UriTemplate/VariableBag.php b/vendor/league/uri/src/UriTemplate/VariableBag.php
new file mode 100644
index 0000000..cf60de9
--- /dev/null
+++ b/vendor/league/uri/src/UriTemplate/VariableBag.php
@@ -0,0 +1,114 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+declare(strict_types=1);
+
+namespace League\Uri\UriTemplate;
+
+use League\Uri\Exceptions\TemplateCanNotBeExpanded;
+use TypeError;
+use function gettype;
+use function is_array;
+use function is_bool;
+use function is_object;
+use function is_scalar;
+use function method_exists;
+use function sprintf;
+
+final class VariableBag
+{
+ /**
+ * @var array<string,string|array<string>>
+ */
+ private array $variables = [];
+
+ /**
+ * @param iterable<string,string|bool|int|float|array<string|bool|int|float>> $variables
+ */
+ public function __construct(iterable $variables = [])
+ {
+ foreach ($variables as $name => $value) {
+ $this->assign($name, $value);
+ }
+ }
+
+ public static function __set_state(array $properties): self
+ {
+ return new self($properties['variables']);
+ }
+
+ /**
+ * @return array<string,string|array<string>>
+ */
+ public function all(): array
+ {
+ return $this->variables;
+ }
+
+ /**
+ * Fetches the variable value if none found returns null.
+ *
+ * @return null|string|array<string>
+ */
+ public function fetch(string $name)
+ {
+ return $this->variables[$name] ?? null;
+ }
+
+ /**
+ * @param string|bool|int|float|array<string|bool|int|float> $value
+ */
+ public function assign(string $name, $value): void
+ {
+ $this->variables[$name] = $this->normalizeValue($value, $name, true);
+ }
+
+ /**
+ * @param mixed $value the value to be expanded
+ *
+ * @throws TemplateCanNotBeExpanded if the value contains nested list
+ *
+ * @return string|array<string>
+ */
+ private function normalizeValue($value, string $name, bool $isNestedListAllowed)
+ {
+ if (is_bool($value)) {
+ return true === $value ? '1' : '0';
+ }
+
+ if (null === $value || is_scalar($value) || (is_object($value) && method_exists($value, '__toString'))) {
+ return (string) $value;
+ }
+
+ if (!is_array($value)) {
+ throw new TypeError(sprintf('The variable '.$name.' must be NULL, a scalar or a stringable object `%s` given', gettype($value)));
+ }
+
+ if (!$isNestedListAllowed) {
+ throw TemplateCanNotBeExpanded::dueToNestedListOfValue($name);
+ }
+
+ foreach ($value as &$var) {
+ $var = self::normalizeValue($var, $name, false);
+ }
+ unset($var);
+
+ return $value;
+ }
+
+ /**
+ * Replaces elements from passed variables into the current instance.
+ */
+ public function replace(VariableBag $variables): self
+ {
+ return new self($this->variables + $variables->variables);
+ }
+}