9
9
use CallbackFilterIterator ;
10
10
use Countable ;
11
11
use DateTimeInterface ;
12
+ use Exception ;
12
13
use Iterator ;
13
14
use IteratorAggregate ;
14
15
use Stringable ;
15
16
use Throwable ;
16
17
17
- use function array_is_list ;
18
18
use function array_key_exists ;
19
19
use function array_keys ;
20
20
use function array_map ;
21
21
use function count ;
22
22
use function implode ;
23
- use function is_array ;
24
23
use function is_bool ;
25
24
use function is_int ;
26
25
use function is_iterable ;
@@ -47,34 +46,12 @@ private function __construct(iterable $members = [])
47
46
{
48
47
$ filteredMembers = [];
49
48
foreach ($ members as $ key => $ member ) {
50
- $ filteredMembers [MapKey ::from ($ key )->value ] = self :: filterMember ($ member );
49
+ $ filteredMembers [Key ::from ($ key )->value ] = Member:: innerListOrItem ($ member );
51
50
}
52
51
53
52
$ this ->members = $ filteredMembers ;
54
53
}
55
54
56
- /**
57
- * @param SfMemberInput $member
58
- */
59
- private static function filterMember (mixed $ member ): InnerList |Item
60
- {
61
- if ($ member instanceof StructuredFieldProvider) {
62
- $ member = $ member ->toStructuredField ();
63
- if ($ member instanceof Item || $ member instanceof InnerList) {
64
- return $ member ;
65
- }
66
-
67
- throw new InvalidArgument ('The ' .StructuredFieldProvider::class.' must provide a ' .Item::class.' or an ' .InnerList::class.'; ' .$ member ::class.' given. ' );
68
- }
69
-
70
- return match (true ) {
71
- $ member instanceof InnerList,
72
- $ member instanceof Item => $ member ,
73
- is_iterable ($ member ) => InnerList::new (...$ member ),
74
- default => Item::new ($ member ),
75
- };
76
- }
77
-
78
55
/**
79
56
* Returns a new instance.
80
57
*/
@@ -125,45 +102,12 @@ public static function fromPairs(StructuredFieldProvider|Dictionary|Parameters|i
125
102
throw new InvalidArgument ('The " ' .$ pairs ::class.'" instance can not be used for creating a . ' .self ::class.' structured field. ' );
126
103
}
127
104
128
- $ converter = function (mixed $ pair ): InnerList |Item {
129
- if ($ pair instanceof StructuredFieldProvider) {
130
- $ pair = $ pair ->toStructuredField ();
131
- if ($ pair instanceof Item || $ pair instanceof InnerList) {
132
- return $ pair ;
133
- }
134
-
135
- throw new InvalidArgument ('The ' .StructuredFieldProvider::class.' must provide a ' .Item::class.' or an ' .InnerList::class.'; ' .$ pair ::class.' given. ' );
136
- }
137
-
138
- if ($ pair instanceof InnerList || $ pair instanceof Item) {
139
- return $ pair ;
140
- }
141
-
142
- if (!is_array ($ pair )) {
143
- return Item::new ($ pair ); /* @phpstan-ignore-line */
144
- }
145
-
146
- if (!array_is_list ($ pair )) {
147
- throw new SyntaxError ('The pair must be represented by an array as a list. ' );
148
- }
149
-
150
- if ([] === $ pair ) {
151
- return InnerList::new ();
152
- }
153
-
154
- if (!in_array (count ($ pair ), [1 , 2 ], true )) {
155
- throw new SyntaxError ('The pair first member represents its value; the second member is its associated parameters. ' );
156
- }
157
-
158
- return is_iterable ($ pair [0 ]) ? InnerList::fromPair ($ pair ) : Item::fromPair ($ pair );
159
- };
160
-
161
105
return match (true ) {
162
106
$ pairs instanceof Dictionary,
163
107
$ pairs instanceof Parameters => new self ($ pairs ->toAssociative ()),
164
- default => new self ((function (iterable $ pairs ) use ( $ converter ) {
108
+ default => new self ((function (iterable $ pairs ) {
165
109
foreach ($ pairs as [$ key , $ member ]) {
166
- yield $ key => $ converter ($ member );
110
+ yield $ key => Member:: innerListOrItemFromPair ($ member );
167
111
}
168
112
})($ pairs )),
169
113
};
@@ -198,7 +142,7 @@ public static function fromRfc8941(Stringable|string $httpValue): self
198
142
*
199
143
* @see https://www.rfc-editor.org/rfc/rfc9651.html#section-3.2
200
144
*
201
- * @throws StructuredFieldError|Throwable If the string is not a valid
145
+ * @throws StructuredFieldError|Exception If the string is not a valid
202
146
*/
203
147
public static function fromHttpValue (Stringable |string $ httpValue , Ietf $ rfc = Ietf::Rfc9651): self
204
148
{
@@ -352,11 +296,7 @@ public function allowedKeys(array $keys): bool
352
296
public function getByKey (string $ key , ?callable $ validate = null ): Item |InnerList
353
297
{
354
298
$ value = $ this ->members [$ key ] ?? throw InvalidOffset::dueToKeyNotFound ($ key );
355
- if (null === $ validate ) {
356
- return $ value ;
357
- }
358
-
359
- if (true === ($ exceptionMessage = $ validate ($ value ))) {
299
+ if (null === $ validate || true === ($ exceptionMessage = $ validate ($ value ))) {
360
300
return $ value ;
361
301
}
362
302
@@ -411,29 +351,25 @@ private function filterIndex(int $index, ?int $max = null): ?int
411
351
public function getByIndex (int $ index , ?callable $ validate = null ): array
412
352
{
413
353
$ foundOffset = $ this ->filterIndex ($ index ) ?? throw InvalidOffset::dueToIndexNotFound ($ index );
414
-
415
- $ validator = function (Item |InnerList $ value , string $ key , int $ index , callable $ validate ): array {
416
- if (true === ($ exceptionMessage = $ validate ($ value , $ key ))) {
417
- return [$ key , $ value ];
354
+ foreach ($ this as $ offset => $ pair ) {
355
+ if ($ offset === $ foundOffset ) {
356
+ break ;
418
357
}
358
+ }
419
359
420
- if (!is_string ( $ exceptionMessage ) || '' === trim ( $ exceptionMessage )) {
421
- $ exceptionMessage = " The member at position '{ index}' whose key is '{key}' with the value '{value}' failed validation. " ;
422
- }
360
+ if (!isset ( $ pair )) {
361
+ throw InvalidOffset:: dueToIndexNotFound ( $ index) ;
362
+ }
423
363
424
- throw new Violation (strtr ($ exceptionMessage , ['{index} ' => $ index , '{key} ' => $ key , '{value} ' => $ value ->toHttpValue ()]));
425
- };
364
+ if (null === $ validate || true === ($ exceptionMessage = $ validate ($ pair [1 ], $ pair [0 ]))) {
365
+ return $ pair ;
366
+ }
426
367
427
- foreach ($ this as $ offset => $ pair ) {
428
- if ($ offset === $ foundOffset ) {
429
- return match ($ validate ) {
430
- null => $ pair ,
431
- default => $ validator ($ pair [1 ], $ pair [0 ], $ index , $ validate ),
432
- };
433
- }
368
+ if (!is_string ($ exceptionMessage ) || '' === trim ($ exceptionMessage )) {
369
+ $ exceptionMessage = "The member at position '{index}' whose key is '{key}' with the value '{value}' failed validation. " ;
434
370
}
435
371
436
- throw InvalidOffset:: dueToIndexNotFound ( $ index );
372
+ throw new Violation ( strtr ( $ exceptionMessage , [ ' { index} ' => $ index , ' {key} ' => $ pair [ 0 ], ' {value} ' => $ pair [ 1 ]-> toHttpValue ()]) );
437
373
}
438
374
439
375
/**
@@ -514,7 +450,7 @@ public function add(
514
450
iterable |StructuredFieldProvider |Dictionary |Parameters |Item |Token |Bytes |DisplayString |DateTimeInterface |string |int |float |bool $ member
515
451
): self {
516
452
$ members = $ this ->members ;
517
- $ members [MapKey ::from ($ key )->value ] = self :: filterMember ($ member );
453
+ $ members [Key ::from ($ key )->value ] = Member:: innerListOrItem ($ member );
518
454
519
455
return $ this ->newInstance ($ members );
520
456
}
@@ -606,7 +542,7 @@ public function append(
606
542
$ members = $ this ->members ;
607
543
unset($ members [$ key ]);
608
544
609
- return $ this ->newInstance ([...$ members , MapKey ::from ($ key )->value => self :: filterMember ($ member )]);
545
+ return $ this ->newInstance ([...$ members , Key ::from ($ key )->value => Member:: innerListOrItem ($ member )]);
610
546
}
611
547
612
548
/**
@@ -626,7 +562,7 @@ public function prepend(
626
562
$ members = $ this ->members ;
627
563
unset($ members [$ key ]);
628
564
629
- return $ this ->newInstance ([MapKey ::from ($ key )->value => self :: filterMember ($ member ), ...$ members ]);
565
+ return $ this ->newInstance ([Key ::from ($ key )->value => Member:: innerListOrItem ($ member ), ...$ members ]);
630
566
}
631
567
632
568
/**
@@ -703,7 +639,7 @@ public function insert(int $index, array ...$members): self
703
639
public function replace (int $ index , array $ pair ): self
704
640
{
705
641
$ offset = $ this ->filterIndex ($ index ) ?? throw InvalidOffset::dueToIndexNotFound ($ index );
706
- $ pair [1 ] = self :: filterMember ($ pair [1 ]);
642
+ $ pair [1 ] = Member:: innerListOrItem ($ pair [1 ]);
707
643
$ pairs = iterator_to_array ($ this ->getIterator ());
708
644
709
645
return match (true ) {
0 commit comments