From 0226e0ca0dc70f9a0310b3eef045ee1c1e0ca3ac Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 13 Dec 2022 20:00:46 +0300 Subject: split into a separate repo --- vendor/league/uri/src/UriTemplate/VariableBag.php | 114 ++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 vendor/league/uri/src/UriTemplate/VariableBag.php (limited to 'vendor/league/uri/src/UriTemplate/VariableBag.php') 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 @@ + + * + * 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> + */ + private array $variables = []; + + /** + * @param iterable> $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> + */ + public function all(): array + { + return $this->variables; + } + + /** + * Fetches the variable value if none found returns null. + * + * @return null|string|array + */ + public function fetch(string $name) + { + return $this->variables[$name] ?? null; + } + + /** + * @param string|bool|int|float|array $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 + */ + 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); + } +} -- cgit v1.2.3