aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/league/uri/UriTemplate/Expression.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/league/uri/UriTemplate/Expression.php')
-rw-r--r--vendor/league/uri/UriTemplate/Expression.php99
1 files changed, 99 insertions, 0 deletions
diff --git a/vendor/league/uri/UriTemplate/Expression.php b/vendor/league/uri/UriTemplate/Expression.php
new file mode 100644
index 000000000..d9d5b9054
--- /dev/null
+++ b/vendor/league/uri/UriTemplate/Expression.php
@@ -0,0 +1,99 @@
+<?php
+
+/**
+ * League.Uri (https://uri.thephpleague.com)
+ *
+ * (c) Ignace Nyamagana Butera <nyamsprod@gmail.com>
+ *
+ * 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 Deprecated;
+use League\Uri\Exceptions\SyntaxError;
+use Stringable;
+
+use function array_filter;
+use function array_map;
+use function array_unique;
+use function explode;
+use function implode;
+
+/**
+ * @internal The class exposes the internal representation of an Expression and its usage
+ * @link https://www.rfc-editor.org/rfc/rfc6570#section-2.2
+ */
+final class Expression
+{
+ /** @var array<VarSpecifier> */
+ private readonly array $varSpecifiers;
+ /** @var array<string> */
+ public readonly array $variableNames;
+ public readonly string $value;
+
+ private function __construct(public readonly Operator $operator, VarSpecifier ...$varSpecifiers)
+ {
+ $this->varSpecifiers = $varSpecifiers;
+ $this->variableNames = array_unique(
+ array_map(
+ static fn (VarSpecifier $varSpecifier): string => $varSpecifier->name,
+ $varSpecifiers
+ )
+ );
+ $this->value = '{'.$operator->value.implode(',', array_map(
+ static fn (VarSpecifier $varSpecifier): string => $varSpecifier->toString(),
+ $varSpecifiers
+ )).'}';
+ }
+
+ /**
+ * @throws SyntaxError if the expression is invalid
+ */
+ public static function new(Stringable|string $expression): self
+ {
+ $parts = Operator::parseExpression($expression);
+
+ return new Expression($parts['operator'], ...array_map(
+ static fn (string $varSpec): VarSpecifier => VarSpecifier::new($varSpec),
+ explode(',', $parts['variables'])
+ ));
+ }
+
+ /**
+ * DEPRECATION WARNING! This method will be removed in the next major point release.
+ *
+ * @throws SyntaxError if the expression is invalid
+ * @see Expression::new()
+ *
+ * @deprecated Since version 7.0.0
+ * @codeCoverageIgnore
+ */
+ #[Deprecated(message:'use League\Uri\UriTemplate\Exppression::new() instead', since:'league/uri:7.0.0')]
+ public static function createFromString(Stringable|string $expression): self
+ {
+ return self::new($expression);
+ }
+
+ public function expand(VariableBag $variables): string
+ {
+ $expanded = implode(
+ $this->operator->separator(),
+ array_filter(
+ array_map(
+ fn (VarSpecifier $varSpecifier): string => $this->operator->expand($varSpecifier, $variables),
+ $this->varSpecifiers
+ ),
+ static fn ($value): bool => '' !== $value
+ )
+ );
+
+ return match ('') {
+ $expanded => '',
+ default => $this->operator->first().$expanded,
+ };
+ }
+}