Skip to content

Commit bc2ee40

Browse files
committed
Adding SuportsParameters::parameter method
1 parent ccedea1 commit bc2ee40

File tree

5 files changed

+83
-18
lines changed

5 files changed

+83
-18
lines changed

src/InnerList.php

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Countable;
88
use Iterator;
99
use IteratorAggregate;
10+
use function array_filter;
1011
use function array_map;
1112
use function array_splice;
1213
use function array_values;
@@ -47,18 +48,32 @@ public static function fromMembers(iterable $members = [], iterable $parameters
4748
return new self(Parameters::fromAssociative($parameters), ...$newMembers);
4849
}
4950

50-
public function toHttpValue(): string
51+
private static function filterMember(Item|ByteSequence|Token|bool|int|float|string $member): Item
5152
{
52-
$returnArray = array_map(fn (Item $value): string => $value->toHttpValue(), $this->members);
53+
return match (true) {
54+
$member instanceof Item => $member,
55+
default => Item::from($member),
56+
};
57+
}
5358

54-
return '('.implode(' ', $returnArray).')'.$this->parameters->toHttpValue();
59+
public function toHttpValue(): string
60+
{
61+
return '('
62+
.implode(' ', array_map(fn (Item $value): string => $value->toHttpValue(), $this->members))
63+
.')'
64+
.$this->parameters->toHttpValue();
5565
}
5666

5767
public function parameters(): Parameters
5868
{
5969
return $this->parameters;
6070
}
6171

72+
public function parameter(string $key): Item|Token|ByteSequence|float|int|bool|string
73+
{
74+
return $this->parameters->get($key)->value();
75+
}
76+
6277
public function count(): int
6378
{
6479
return count($this->members);
@@ -113,14 +128,6 @@ public function unshift(Item|ByteSequence|Token|bool|int|float|string ...$member
113128
$this->members = [...array_map(self::filterMember(...), $members), ...$this->members];
114129
}
115130

116-
private static function filterMember(Item|ByteSequence|Token|bool|int|float|string $member): Item
117-
{
118-
return match (true) {
119-
$member instanceof Item => $member,
120-
default => Item::from($member),
121-
};
122-
}
123-
124131
/**
125132
* Insert members at the end of the list.
126133
*/
@@ -147,25 +154,30 @@ public function insert(int $index, Item|ByteSequence|Token|bool|int|float|string
147154

148155
public function replace(int $index, Item|ByteSequence|Token|bool|int|float|string $member): void
149156
{
150-
if (!$this->has($index)) {
157+
if (null === ($offset = $this->filterIndex($index))) {
151158
throw InvalidOffset::dueToIndexNotFound($index);
152159
}
153160

154-
$this->members[$this->filterIndex($index)] = self::filterMember($member);
161+
$this->members[$offset] = self::filterMember($member);
155162
}
156163

157164
/**
158165
* Delete members associated with the list of instance indexes.
159166
*/
160167
public function remove(int ...$indexes): void
161168
{
162-
foreach (array_map(fn (int $index): int|null => $this->filterIndex($index), $indexes) as $index) {
163-
if (null !== $index) {
164-
unset($this->members[$index]);
165-
}
169+
$offsets = array_filter(
170+
array_map(fn (int $index): int|null => $this->filterIndex($index), $indexes),
171+
fn (int|null $index): bool => null !== $index
172+
);
173+
174+
foreach ($offsets as $offset) {
175+
unset($this->members[$offset]);
166176
}
167177

168-
$this->members = array_values($this->members);
178+
if ([] !== $offsets) {
179+
$this->members = array_values($this->members);
180+
}
169181
}
170182

171183
/**

src/InnerListTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,25 @@ public function it_can_be_regenerated_with_eval(): void
168168

169169
self::assertEquals($instance, $generatedInstance);
170170
}
171+
172+
/**
173+
* @test
174+
*/
175+
public function it_can_access_its_parameter_values(): void
176+
{
177+
$instance = InnerList::fromMembers([false], ['foo' => 'bar']);
178+
179+
self::assertSame('bar', $instance->parameter('foo'));
180+
}
181+
182+
/**
183+
* @test
184+
*/
185+
public function it_fails_to_access_unknown_parameter_values(): void
186+
{
187+
$this->expectException(InvalidOffset::class);
188+
189+
$instance = InnerList::fromMembers([false], ['foo' => 'bar']);
190+
$instance->parameter('bar');
191+
}
171192
}

src/Item.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,11 @@ public function parameters(): Parameters
273273
return $this->parameters;
274274
}
275275

276+
public function parameter(string $key): Item|Token|ByteSequence|float|int|bool|string
277+
{
278+
return $this->parameters->get($key)->value();
279+
}
280+
276281
public function isInteger(): bool
277282
{
278283
return is_int($this->value);

src/ItemTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,4 +220,25 @@ public function it_can_be_regenerated_with_eval(): void
220220

221221
self::assertEquals($instance, $generatedInstance);
222222
}
223+
224+
/**
225+
* @test
226+
*/
227+
public function it_can_access_its_parameter_values(): void
228+
{
229+
$instance = Item::fromHttpValue('1; a; b=?0');
230+
231+
self::assertTrue($instance->parameter('a'));
232+
}
233+
234+
/**
235+
* @test
236+
*/
237+
public function it_fails_to_access_unknown_parameter_values(): void
238+
{
239+
$this->expectException(InvalidOffset::class);
240+
241+
$instance = Item::fromHttpValue('1; a; b=?0');
242+
$instance->parameter('bar');
243+
}
223244
}

src/SupportsParameters.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,10 @@
77
interface SupportsParameters
88
{
99
public function parameters(): Parameters;
10+
11+
/**
12+
* @throws SyntaxError if the key used is invalid according to RFC8941
13+
* @throws InvalidOffset If no value is found for the given key
14+
*/
15+
public function parameter(string $key): Item|Token|ByteSequence|float|int|bool|string;
1016
}

0 commit comments

Comments
 (0)