aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/bakame/http-structured-fields/src/Member.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/bakame/http-structured-fields/src/Member.php')
-rw-r--r--vendor/bakame/http-structured-fields/src/Member.php116
1 files changed, 116 insertions, 0 deletions
diff --git a/vendor/bakame/http-structured-fields/src/Member.php b/vendor/bakame/http-structured-fields/src/Member.php
new file mode 100644
index 000000000..ee315b078
--- /dev/null
+++ b/vendor/bakame/http-structured-fields/src/Member.php
@@ -0,0 +1,116 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Bakame\Http\StructuredFields;
+
+use function count;
+use function in_array;
+use function is_array;
+use function is_iterable;
+
+/**
+ * @phpstan-import-type SfMemberInput from StructuredFieldProvider
+ * @phpstan-import-type SfItemInput from StructuredFieldProvider
+ * @phpstan-import-type SfItemPair from StructuredFieldProvider
+ * @phpstan-import-type SfInnerListPair from StructuredFieldProvider
+ * @phpstan-import-type SfTypeInput from StructuredFieldProvider
+ *
+ * @internal Validate containers member
+ */
+final class Member
+{
+ /**
+ * @param SfMemberInput $value
+ */
+ public static function innerListOrItem(mixed $value): InnerList|Item
+ {
+ if ($value instanceof StructuredFieldProvider) {
+ $value = $value->toStructuredField();
+ if ($value instanceof Item || $value instanceof InnerList) {
+ return $value;
+ }
+
+ throw new InvalidArgument('The '.StructuredFieldProvider::class.' must provide a '.Item::class.' or an '.InnerList::class.'; '.$value::class.' given.');
+ }
+
+ return match (true) {
+ $value instanceof InnerList,
+ $value instanceof Item => $value,
+ is_iterable($value) => InnerList::new(...$value),
+ default => Item::new($value),
+ };
+ }
+
+ public static function innerListOrItemFromPair(mixed $value): InnerList|Item
+ {
+ if ($value instanceof StructuredFieldProvider) {
+ $value = $value->toStructuredField();
+ if ($value instanceof Item || $value instanceof InnerList) {
+ return $value;
+ }
+
+ throw new InvalidArgument('The '.StructuredFieldProvider::class.' must provide a '.Item::class.' or an '.InnerList::class.'; '.$value::class.' given.');
+ }
+
+ if ($value instanceof InnerList || $value instanceof Item) {
+ return $value;
+ }
+
+ if (!is_array($value)) {
+ if (is_iterable($value)) {
+ throw new SyntaxError('The value must be an Item value not an iterable.');
+ }
+
+ return Item::new($value); /* @phpstan-ignore-line */
+ }
+
+ if (!array_is_list($value)) {
+ throw new SyntaxError('The pair must be represented by an array as a list.');
+ }
+
+ if ([] === $value) {
+ return InnerList::new();
+ }
+
+ if (!in_array(count($value), [1, 2], true)) {
+ throw new SyntaxError('The pair first member represents its value; the second member is its associated parameters.');
+ }
+
+ return is_iterable($value[0]) ? InnerList::fromPair($value) : Item::fromPair($value);
+ }
+
+ /**
+ * @param SfItemInput|SfItemPair $value
+ */
+ public static function item(mixed $value): Item
+ {
+ if ($value instanceof StructuredFieldProvider) {
+ $value = $value->toStructuredField();
+ if (!$value instanceof Item) {
+ throw new InvalidArgument('The '.StructuredFieldProvider::class.' must provide a '.Item::class.'; '.$value::class.' given.');
+ }
+
+ return $value;
+ }
+
+ if ($value instanceof Item) {
+ return $value;
+ }
+
+ return Item::new($value);
+ }
+
+ /**
+ * @param SfItemInput|SfItemPair $value
+ */
+ public static function bareItem(mixed $value): Item
+ {
+ $bareItem = self::item($value);
+ if ($bareItem->parameters()->isNotEmpty()) {
+ throw new InvalidArgument('The "'.$bareItem::class.'" instance is not a Bare Item.');
+ }
+
+ return $bareItem;
+ }
+}