Skip to content

Commit 491e5af

Browse files
committed
Refactor the parser to only return array structure composed of Item or Item values
1 parent 8874d02 commit 491e5af

File tree

4 files changed

+97
-25
lines changed

4 files changed

+97
-25
lines changed

src/Dictionary.php

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,10 @@ public static function __set_state(array $properties): self
3838
* its keys represent the dictionary entry key
3939
* its values represent the dictionary entry value
4040
*
41-
* @param iterable<string, InnerList|Item|ByteSequence|Token|bool|int|float|string> $members
41+
* @param iterable<string, InnerList|Item|ByteSequence|Token|array{
42+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
43+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
44+
* }|bool|int|float|string> $members
4245
*/
4346
public static function fromAssociative(iterable $members = []): self
4447
{
@@ -57,7 +60,10 @@ public static function fromAssociative(iterable $members = []): self
5760
* the first member represents the instance entry key
5861
* the second member represents the instance entry value
5962
*
60-
* @param iterable<array{0:string, 1:InnerList|Item|ByteSequence|Token|bool|int|float|string}> $pairs
63+
* @param iterable<array{0:string, 1:InnerList|Item|ByteSequence|Token|array{
64+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
65+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
66+
* }|bool|int|float|string}> $pairs
6167
*/
6268
public static function fromPairs(iterable $pairs = []): self
6369
{
@@ -128,6 +134,8 @@ public function toPairs(): Iterator
128134
}
129135

130136
/**
137+
* Returns an ordered list of the instance keys.
138+
*
131139
* @return array<string>
132140
*/
133141
public function keys(): array
@@ -186,7 +194,6 @@ private function filterIndex(int $index): int|null
186194
* Returns the item or the inner-list and its key as attached to the given
187195
* collection according to their index position otherwise throw.
188196
*
189-
* @throws SyntaxError If the key is invalid
190197
* @throws InvalidOffset If the key is not found
191198
*
192199
* @return array{0:string, 1:Item|InnerList}
@@ -211,8 +218,13 @@ public function pair(int $index): array
211218

212219
/**
213220
* Add a member at the end of the instance if the key is new otherwise update the value associated with the key.
221+
*
222+
* @param InnerList|Item|ByteSequence|Token|array{
223+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
224+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
225+
* }|bool|int|float|string $member
214226
*/
215-
public function set(string $key, InnerList|Item|ByteSequence|Token|bool|int|float|string $member): void
227+
public function set(string $key, InnerList|Item|ByteSequence|Token|array|bool|int|float|string $member): void
216228
{
217229
self::validateKey($key);
218230

@@ -230,12 +242,16 @@ private static function validateKey(string $key): void
230242
}
231243

232244
/**
233-
* Format the member type.
245+
* @param InnerList|Item|ByteSequence|Token|array{
246+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
247+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
248+
* }|bool|int|float|string $member
234249
*/
235-
private static function filterMember(InnerList|Item|ByteSequence|Token|bool|int|float|string $member): InnerList|Item
250+
private static function filterMember(InnerList|Item|ByteSequence|Token|array|bool|int|float|string $member): InnerList|Item
236251
{
237252
return match (true) {
238253
$member instanceof InnerList, $member instanceof Item => $member,
254+
is_iterable($member) => InnerList::fromList(...$member),
239255
default => Item::from($member),
240256
};
241257
}
@@ -260,8 +276,13 @@ public function clear(): void
260276

261277
/**
262278
* Add a member at the end of the instance if the key is new delete any previous reference to the key.
279+
*
280+
* @param InnerList|Item|ByteSequence|Token|array{
281+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
282+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
283+
* }|bool|int|float|string $member
263284
*/
264-
public function append(string $key, InnerList|Item|ByteSequence|Token|bool|int|float|string $member): void
285+
public function append(string $key, InnerList|Item|ByteSequence|Token|array|bool|int|float|string $member): void
265286
{
266287
self::validateKey($key);
267288

@@ -272,8 +293,13 @@ public function append(string $key, InnerList|Item|ByteSequence|Token|bool|int|f
272293

273294
/**
274295
* Add a member at the beginning of the instance if the key is new delete any previous reference to the key.
296+
*
297+
* @param InnerList|Item|ByteSequence|Token|array{
298+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
299+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
300+
* }|bool|int|float|string $member
275301
*/
276-
public function prepend(string $key, InnerList|Item|ByteSequence|Token|bool|int|float|string $member): void
302+
public function prepend(string $key, InnerList|Item|ByteSequence|Token|array|bool|int|float|string $member): void
277303
{
278304
self::validateKey($key);
279305

@@ -285,7 +311,10 @@ public function prepend(string $key, InnerList|Item|ByteSequence|Token|bool|int|
285311
/**
286312
* Merge multiple instances.
287313
*
288-
* @param iterable<array-key, InnerList|Item|Token|ByteSequence|float|int|bool|string> ...$others
314+
* @param iterable<array-key, InnerList|Item|ByteSequence|Token|array{
315+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
316+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
317+
* }|bool|int|float|string> ...$others
289318
*/
290319
public function merge(iterable ...$others): void
291320
{

src/OrderedList.php

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,22 @@ public static function __set_state(array $properties): self
3434
return new self(...$properties['members']);
3535
}
3636

37-
public static function from(InnerList|Item|ByteSequence|Token|bool|int|float|string ...$members): self
37+
/**
38+
* @param InnerList|Item|ByteSequence|Token|array{
39+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
40+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
41+
* }|bool|int|float|string ...$members
42+
*/
43+
public static function from(InnerList|Item|ByteSequence|Token|array|bool|int|float|string ...$members): self
3844
{
3945
return self::fromList($members);
4046
}
4147

4248
/**
43-
* @param iterable<InnerList|Item|ByteSequence|Token|bool|int|float|string> $members
49+
* @param iterable<InnerList|Item|ByteSequence|Token|array{
50+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
51+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
52+
* }|bool|int|float|string> $members
4453
*/
4554
public static function fromList(iterable $members = []): self
4655
{
@@ -52,10 +61,17 @@ public static function fromList(iterable $members = []): self
5261
return new self(...$newMembers);
5362
}
5463

55-
private static function filterMember(InnerList|Item|ByteSequence|Token|bool|int|float|string $member): InnerList|Item
64+
/**
65+
* @param InnerList|Item|ByteSequence|Token|array{
66+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
67+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
68+
* }|bool|int|float|string $member
69+
*/
70+
private static function filterMember(InnerList|Item|ByteSequence|Token|array|bool|int|float|string $member): InnerList|Item
5671
{
5772
return match (true) {
5873
$member instanceof InnerList, $member instanceof Item => $member,
74+
is_array($member) => InnerList::fromList($member[0], $member[1]),
5975
default => Item::from($member),
6076
};
6177
}
@@ -123,28 +139,43 @@ public function get(int $index): Item|InnerList
123139

124140
/**
125141
* Insert members at the beginning of the list.
142+
*
143+
* @param InnerList|Item|ByteSequence|Token|array{
144+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
145+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
146+
* }|bool|int|float|string ...$members
126147
*/
127-
public function unshift(InnerList|Item|ByteSequence|Token|bool|int|float|string ...$members): void
148+
public function unshift(InnerList|Item|ByteSequence|Token|array|bool|int|float|string ...$members): void
128149
{
129150
$this->members = [...array_map(self::filterMember(...), $members), ...$this->members];
130151
}
131152

132153
/**
133154
* Insert members at the end of the list.
155+
*
156+
* @param InnerList|Item|ByteSequence|Token|array{
157+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
158+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
159+
* }|bool|int|float|string ...$members
134160
*/
135-
public function push(InnerList|Item|ByteSequence|Token|bool|int|float|string ...$members): void
161+
public function push(InnerList|Item|ByteSequence|Token|array|bool|int|float|string ...$members): void
136162
{
137163
$this->members = [...$this->members, ...array_map(self::filterMember(...), $members)];
138164
}
139165

140166
/**
141167
* Insert members starting at the given index.
142168
*
169+
* @param InnerList|Item|ByteSequence|Token|array{
170+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
171+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
172+
* }|bool|int|float|string ...$members
173+
*
143174
* @throws InvalidOffset If the index does not exist
144175
*/
145176
public function insert(
146177
int $index,
147-
InnerList|Item|ByteSequence|Token|bool|int|float|string ...$members
178+
InnerList|Item|ByteSequence|Token|array|bool|int|float|string ...$members
148179
): void {
149180
$offset = $this->filterIndex($index);
150181
match (true) {
@@ -158,9 +189,14 @@ public function insert(
158189
/**
159190
* Replace the member associated with the index.
160191
*
192+
* @param InnerList|Item|ByteSequence|Token|array{
193+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
194+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
195+
* }|bool|int|float|string $member
196+
*
161197
* @throws InvalidOffset If the index does not exist
162198
*/
163-
public function replace(int $index, InnerList|Item|ByteSequence|Token|bool|int|float|string $member): void
199+
public function replace(int $index, InnerList|Item|ByteSequence|Token|array|bool|int|float|string $member): void
164200
{
165201
if (null === ($offset = $this->filterIndex($index))) {
166202
throw InvalidOffset::dueToIndexNotFound($index);

src/Parameters.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ private function filterIndex(int $index): int|null
241241
}
242242

243243
/**
244-
* Returns the key-item pair positionned at a given index.
244+
* Returns the key-item pair found at a given index.
245245
*
246246
* @throws InvalidOffset if the index is not found
247247
* @throws ForbiddenStateError if the found item is in invalid state

src/Parser.php

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
use function substr;
1414

1515
/**
16-
* A parser to create HTTP Structured Fields value objects from HTTP textual representation.
16+
* A class to parse HTTP Structured Fields from their HTTP textual representation according to RFC8941.
1717
*
1818
* Based on gapple\StructuredFields\Parser class in Structured Field Values for PHP v1.0.0.
1919
* @link https://github.com/gapple/structured-fields/blob/v1.0.0/src/Parser.php
@@ -29,7 +29,10 @@ final class Parser
2929
*
3030
* @see https://www.rfc-editor.org/rfc/rfc8941.html#section-4.2.1
3131
*
32-
* @return array<InnerList|Item|ByteSequence|Token|bool|int|float|string>
32+
* @return array<array{
33+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
34+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
35+
* }|Item|ByteSequence|Token|bool|int|float|string>
3336
*/
3437
public static function parseList(string $httpValue): array
3538
{
@@ -60,7 +63,10 @@ public static function parseList(string $httpValue): array
6063
*
6164
* @see https://www.rfc-editor.org/rfc/rfc8941.html#section-4.2.2
6265
*
63-
* @return array<string, InnerList|Item|ByteSequence|Token|bool|int|float|string>
66+
* @return array<string, Item|ByteSequence|Token|array{
67+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
68+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
69+
* }|bool|int|float|string>
6470
*/
6571
public static function parseDictionary(string $httpValue): array
6672
{
@@ -125,14 +131,15 @@ public static function parseInnerList(string $httpValue): array
125131
*
126132
* @see https://www.rfc-editor.org/rfc/rfc8941.html#section-4.2.1.1
127133
*
128-
* @return array{0: InnerList|Item, 1:int}
134+
* @return array{0: array{
135+
* 0:array<Item|ByteSequence|Token|bool|int|float|string>,
136+
* 1:array<string,Item|ByteSequence|Token|bool|int|float|string>
137+
* }|Item, 1:int}
129138
*/
130139
private static function parseItemOrInnerList(string $httpValue): array
131140
{
132141
if ('(' === $httpValue[0]) {
133-
[$innerList, $offset] = self::parseInnerListValue($httpValue);
134-
135-
return [InnerList::fromList(...$innerList), $offset];
142+
return self::parseInnerListValue($httpValue);
136143
}
137144

138145
[$value, $offset] = self::parseBareItem($httpValue);
@@ -210,7 +217,7 @@ private static function parseBareItem(string $httpValue): array
210217
*
211218
* @see https://www.rfc-editor.org/rfc/rfc8941.html#section-4.2.3.2
212219
*
213-
* @return array{0:array<array-key, Item|Token|ByteSequence|float|int|bool|string>, 1:int}
220+
* @return array{0:array<array-key, Token|ByteSequence|float|int|bool|string>, 1:int}
214221
*/
215222
private static function parseParameters(string $httpValue): array
216223
{

0 commit comments

Comments
 (0)