Skip to content

Commit b0ab252

Browse files
committed
Use readonly properties for parameters and Item value
1 parent d164805 commit b0ab252

14 files changed

+83
-108
lines changed

CHANGELOG.md

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,34 +6,39 @@ All Notable changes to `bakame/http-strucured-fields` will be documented in this
66

77
### Added
88

9-
- `Item::exchangeParameters` to fully replace the `Item` associated parameters
10-
- `InnerList::exchangeParameters` to fully replace the `InnerList` associated parameters
11-
- `InnerList::from` named constructor which accepts a variadic list of members items
9+
- `Item::value` is a public readonly property that gives access to the item value
10+
- `Item::parameters` is a public readonly property that gives access to the item parameters
11+
- `InnerList::parameters` is a public readonly property that gives access to the list parameters
1212
- `OrderedList::from` named constructor which accepts a variadic list of members items
1313
- `Token::fromString` named constructor which accepts `string` and `Stringable` object
1414
- `Parameter::values` returns an array of all the values contained inside the `Parameters` instance
15-
- [BC Break] `InnerList::fromList` to replace `InnerList::fromMembers`
16-
- [BC Break] `OrderedList::fromList` to replace `OrderedList::fromMembers`
17-
- [BC Break] `Parameter::value` to replace `InnerList::parameter` and `Item::parameter`
15+
- `Parameter::merge` accepts any iterable that can be accepted by `Parameter::fromAssociative` as variadic parameter
16+
- **[BC Break]** `InnerList::fromList` to replace `InnerList::fromMembers`
17+
- **[BC Break]** `OrderedList::fromList` to replace `OrderedList::fromMembers`
18+
- **[BC Break]** `Parameter::value` to replace `InnerList::parameter` and `Item::parameter`
1819

1920
### Fixed
2021

2122
- `ByteSequence::fromDecoded` named constructor also accepts a `Stringable` object
2223
- `ByteSequence::fromEncoded` named constructor also accepts a `Stringable` object
23-
- [BC Break] `OrderedList::__construct` is made private use `OrderedList::from` instead
24-
- [BC Break] `InnerList::__construct` is made private use `InnerList::fromList` instead
25-
- [BC Break] `Token::__construct` is made private use `Token::fromString` instead
24+
- **[BC Break]** `OrderedList::__construct` is made private use `OrderedList::from` instead
25+
- **[BC Break]** `InnerList::__construct` is made private use `InnerList::fromList` instead
26+
- **[BC Break]** `Token::__construct` is made private use `Token::fromString` instead
2627

2728
### Deprecated
2829

2930
- None
3031

3132
### Removed
3233

33-
- [BC Break] `InnerList::fromMembers` replaced by `InnerList::fromList`
34-
- [BC Break] `OrderedList::fromMembers` replaced by `OrderedList::fromList`
35-
- [BC Break] `Item::parameter` replaced by `Parameter::value`
36-
- [BC Break] `InnerList::parameter` replaced by `Parameter::value`
34+
- **[BC Break]** `InnerList::fromMembers` replaced by `InnerList::fromList`
35+
- **[BC Break]** `OrderedList::fromMembers` replaced by `OrderedList::fromList`
36+
- **[BC Break]** `Item::parameter` replaced by `Parameter::value`
37+
- **[BC Break]** `InnerList::parameter` replaced by `Parameter::value`
38+
- **[BC Break]** `SupportsParameters` interface is removed without replacement
39+
- **[BC Break]** `Item::value()` replaced by `Item::value` public readonly property
40+
- **[BC Break]** `Item::parameters()` replaced by `Item::parameters` public readonly property
41+
- **[BC Break]** `InnerList::parameters()` replaced by `InnerList::parameters` public readonly property
3742

3843
## [0.1.0] - 2022-03-18
3944

README.md

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ The package can be used to:
2424
use Bakame\Http\StructuredFields\Item;
2525

2626
$field = Item::from("/terms", ['rel' => "copyright", 'anchor' => '#foo']);
27-
echo $field->toHttpValue(); //display "/terms";rel="copyright";anchor="#foo"
28-
echo $field->value(); //display "/terms"
29-
echo $field->parameter('rel'); //display "copyright"
27+
echo $field->toHttpValue(); //display "/terms";rel="copyright";anchor="#foo"
28+
echo $field->value; //display "/terms"
29+
echo $field->parameter->value('rel'); //display "copyright"
3030
```
3131

3232
System Requirements
@@ -119,18 +119,17 @@ Instantiation via type recognition is done using the `Item::from` named construc
119119
use Bakame\Http\StructuredFields\Item;
120120

121121
$item = Item::from("hello world", ["a" => 1]);
122-
$item->value(); //returns "hello world"
122+
$item->value; //returns "hello world"
123123
$item->isString(); //return true
124124
$item->isToken(); //return false
125-
$item->parameter("a"); //returns 1
125+
$item->parameters->value("a"); //returns 1
126126
```
127127

128128

129-
Once instantiated, accessing `Item` properties is done via three (3) methods:
129+
Once instantiated, accessing `Item` properties is done via three (2) readonly properties:
130130

131-
- `Item::value()` which returns the instance underlying value
132-
- `Item::parameters()` which returns the parameters associated to the `Item` as a distinct `Parameters` object
133-
- `Item::parameter(string $key)` which returns the HTTP data type attached to the parameter `$key`.
131+
- `Item::value` which returns the instance underlying value
132+
- `Item::parameters` which returns the parameters associated to the `Item` as a distinct `Parameters` object
134133

135134
**Of note: to instantiate a decimal number type a float MUST be used as the first argument input.**
136135

@@ -220,6 +219,7 @@ The `Parameters` instance exposes the following methods:
220219

221220
- `Parameters::values` to list all existing Bare Items value as an array list;
222221
- `Parameters::value($key)` to return the value of the Bare Item associated to the `$key` or throw if the key is unknown or invalid;
222+
- `Parameters::merge` also accepts iterable as associative key-value as part of the variadic signature.
223223

224224
```php
225225
use Bakame\Http\StructuredFields\Parameters;
@@ -233,6 +233,12 @@ $parameters->value('b'); // returns true
233233
$parameters->get('b'); // returns Item::from(true)
234234
iterator_to_array($parameters->toPairs(), true); // returns [['b', Item::from(true)], ['foo', Item::from('bar')]]
235235
iterator_to_array($parameters, true); // returns ['b' => Item::from(true), 'foo' => Item::from('bar')]
236+
$parameters->merge(
237+
Parameters::fromAssociative(['b' => true, 'foo' => 'foo']),
238+
['b' => 'false']
239+
);
240+
$parameters->toHttpValue(); // returns ;b="false";foo="foo"
241+
236242
```
237243

238244
#### Lists
@@ -277,15 +283,15 @@ RFC but the main ones are:
277283

278284
- `InnerList` members must be `Items`;
279285
- `OrderedList` members must be `InnerList` or `Items`;
280-
- `InnerList` can have a `Parameters` instance attached to it, not `OrderedList`;
286+
- `InnerList` has a `Parameters` instance attached to it that you can access via its readonly property `parameters`, not `OrderedList`;
281287

282288
```php
283289
use Bakame\Http\StructuredFields\InnerList;
284290
use Bakame\Http\StructuredFields\Parameters;
285291

286292
$innerList = InnerList::fromList([42, 42.0, "42"], ["a" => true]);
287-
$innerList->parameters(); //returns a Parameters object
288-
$innerList->parameters()->value('a'); // returns true
293+
$innerList->parameters; //returns a Parameters object
294+
$innerList->parameters->value('a'); // returns true
289295
```
290296

291297
Contributing

phpstan.neon

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@ parameters:
77
paths:
88
- src
99
ignoreErrors:
10+
- message: '#Method Bakame\\Http\\StructuredFields\\Parameters::merge\(\) has parameter \$others with no value type specified in iterable type iterable.#'
11+
path: src/Parameters.php
1012
reportUnmatchedIgnoredErrors: true

src/Dictionary.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public function toHttpValue(): string
8585
$returnValue = [];
8686
foreach ($this->members as $key => $member) {
8787
$returnValue[] = match (true) {
88-
$member instanceof Item && true === $member->value() => $key.$member->parameters()->toHttpValue(),
88+
$member instanceof Item && true === $member->value => $key.$member->parameters->toHttpValue(),
8989
default => $key.'='.$member->toHttpValue(),
9090
};
9191
}

src/DictionaryTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ public function it_can_add_or_remove_members(): void
7878
/** @var array{0:string, 1:Item} $foundItem */
7979
$foundItem = $instance->pair(1);
8080

81-
self::assertIsString($foundItem[1]->value());
82-
self::assertStringContainsString('BarBaz', $foundItem[1]->value());
81+
self::assertIsString($foundItem[1]->value);
82+
self::assertStringContainsString('BarBaz', $foundItem[1]->value);
8383

8484
$instance->delete('foobar', 'string');
8585
self::assertCount(0, $instance);

src/InnerList.php

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616
/**
1717
* @implements IteratorAggregate<array-key, Item>
1818
*/
19-
final class InnerList implements Countable, IteratorAggregate, StructuredField, SupportsParameters
19+
final class InnerList implements Countable, IteratorAggregate, StructuredField
2020
{
2121
/** @var array<Item> */
2222
private array $members;
2323

24-
private function __construct(private Parameters $parameters, Item ...$members)
25-
{
24+
private function __construct(
25+
public readonly Parameters $parameters,
26+
Item ...$members
27+
) {
2628
$this->members = $members;
2729
}
2830

@@ -69,19 +71,6 @@ public function toHttpValue(): string
6971
.$this->parameters->toHttpValue();
7072
}
7173

72-
public function parameters(): Parameters
73-
{
74-
return $this->parameters;
75-
}
76-
77-
/**
78-
* @param Parameters|iterable<array-key, Item|Token|ByteSequence|float|int|bool|string> $parameters
79-
*/
80-
public function exchangeParameters(Parameters|iterable $parameters): void
81-
{
82-
$this->parameters = Parameters::fromAssociative($parameters);
83-
}
84-
8574
public function count(): int
8675
{
8776
return count($this->members);
@@ -203,7 +192,7 @@ public function merge(self ...$others): void
203192
{
204193
foreach ($others as $other) {
205194
$this->members = [...$this->members, ...$other->members];
206-
$this->parameters->merge($other->parameters());
195+
$this->parameters->merge($other->parameters);
207196
}
208197
}
209198
}

src/InnerListTest.php

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public function it_can_be_instantiated_with_an_collection_of_item(): void
2222
$booleanItem = Item::from(true);
2323
$arrayParams = [$stringItem, $booleanItem];
2424
$instance = InnerList::fromList($arrayParams, Parameters::fromAssociative(['test' => Item::from(42)]));
25-
self::assertFalse($instance->parameters()->isEmpty());
25+
self::assertFalse($instance->parameters->isEmpty());
2626

2727
self::assertSame($stringItem, $instance->get(0));
2828
self::assertFalse($instance->isEmpty());
@@ -44,7 +44,7 @@ public function it_can_add_or_remove_members(): void
4444

4545
self::assertCount(2, $instance);
4646
self::assertTrue($instance->has(1));
47-
self::assertTrue($instance->parameters()->isEmpty());
47+
self::assertTrue($instance->parameters->isEmpty());
4848

4949
$instance->remove(1);
5050

@@ -55,8 +55,8 @@ public function it_can_add_or_remove_members(): void
5555
$instance->insert(1, );
5656
$member = $instance->get(1);
5757
self::assertCount(2, $instance);
58-
self::assertIsString($member->value());
59-
self::assertStringContainsString('BarBaz', $member->value());
58+
self::assertIsString($member->value);
59+
self::assertStringContainsString('BarBaz', $member->value);
6060

6161
$instance->remove(0, 1);
6262
self::assertCount(0, $instance);
@@ -176,7 +176,7 @@ public function it_can_access_its_parameter_values(): void
176176
{
177177
$instance = InnerList::fromList([false], ['foo' => 'bar']);
178178

179-
self::assertSame('bar', $instance->parameters()->value('foo'));
179+
self::assertSame('bar', $instance->parameters->value('foo'));
180180
}
181181

182182
/**
@@ -187,7 +187,7 @@ public function it_fails_to_access_unknown_parameter_values(): void
187187
$this->expectException(InvalidOffset::class);
188188

189189
$instance = InnerList::fromList([false], ['foo' => 'bar']);
190-
$instance->parameters()->value('bar');
190+
$instance->parameters->value('bar');
191191
}
192192

193193
/**
@@ -197,11 +197,11 @@ public function it_can_exchange_parameters(): void
197197
{
198198
$instance = InnerList::from(false, true, 42, 'forty-two');
199199

200-
self::assertCount(0, $instance->parameters());
200+
self::assertCount(0, $instance->parameters);
201+
$instance->parameters->clear();
202+
$instance->parameters->merge(['foo' => 'bar']);
201203

202-
$instance->exchangeParameters(['foo' => 'bar']);
203-
204-
self::assertCount(1, $instance->parameters());
205-
self::assertSame('bar', $instance->parameters()->value('foo'));
204+
self::assertCount(1, $instance->parameters);
205+
self::assertSame('bar', $instance->parameters->value('foo'));
206206
}
207207
}

src/Item.php

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818
use function substr;
1919
use function trim;
2020

21-
final class Item implements StructuredField, SupportsParameters
21+
final class Item implements StructuredField
2222
{
2323
private function __construct(
24-
private Token|ByteSequence|int|float|string|bool $value,
25-
private Parameters $parameters
24+
public readonly Token|ByteSequence|int|float|string|bool $value,
25+
public readonly Parameters $parameters
2626
) {
2727
}
2828

@@ -263,24 +263,6 @@ private function serializeDecimal(float $value): string
263263
return $result.'.0';
264264
}
265265

266-
public function value(): Token|ByteSequence|int|float|string|bool
267-
{
268-
return $this->value;
269-
}
270-
271-
public function parameters(): Parameters
272-
{
273-
return $this->parameters;
274-
}
275-
276-
/**
277-
* @param Parameters|iterable<array-key, Item|Token|ByteSequence|float|int|bool|string> $parameters
278-
*/
279-
public function exchangeParameters(Parameters|iterable $parameters): void
280-
{
281-
$this->parameters = Parameters::fromAssociative($parameters);
282-
}
283-
284266
public function isInteger(): bool
285267
{
286268
return is_int($this->value);

src/ItemTest.php

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public function it_instantiates_a_token(): void
9797
*/
9898
public function it_instantiates_a_binary(): void
9999
{
100-
self::assertInstanceOf(ByteSequence::class, Item::from(ByteSequence::fromDecoded('foobar'))->value());
100+
self::assertInstanceOf(ByteSequence::class, Item::from(ByteSequence::fromDecoded('foobar'))->value);
101101
}
102102

103103
/**
@@ -228,7 +228,7 @@ public function it_can_access_its_parameter_values(): void
228228
{
229229
$instance = Item::fromHttpValue('1; a; b=?0');
230230

231-
self::assertTrue($instance->parameters()->value('a'));
231+
self::assertTrue($instance->parameters->value('a'));
232232
}
233233

234234
/**
@@ -239,7 +239,7 @@ public function it_fails_to_access_unknown_parameter_values(): void
239239
$this->expectException(InvalidOffset::class);
240240

241241
$instance = Item::fromHttpValue('1; a; b=?0');
242-
$instance->parameters()->value('bar');
242+
$instance->parameters->value('bar');
243243
}
244244

245245
/**
@@ -249,11 +249,12 @@ public function it_can_exchange_parameters(): void
249249
{
250250
$instance = Item::from(Token::fromString('babayaga'));
251251

252-
self::assertCount(0, $instance->parameters());
252+
self::assertCount(0, $instance->parameters);
253253

254-
$instance->exchangeParameters(['foo' => 'bar']);
254+
$instance->parameters->clear();
255+
$instance->parameters->merge(['foo' => 'bar']);
255256

256-
self::assertCount(1, $instance->parameters());
257-
self::assertSame('bar', $instance->parameters()->value('foo'));
257+
self::assertCount(1, $instance->parameters);
258+
self::assertSame('bar', $instance->parameters->value('foo'));
258259
}
259260
}

src/OrderedListTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ public function it_can_add_or_remove_members(): void
5454

5555
self::assertCount(2, $instance);
5656
self::assertInstanceOf(Item::class, $member);
57-
self::assertIsString($member->value());
58-
self::assertStringContainsString('BarBaz', $member->value());
57+
self::assertIsString($member->value);
58+
self::assertStringContainsString('BarBaz', $member->value);
5959

6060
$instance->remove(0, 1);
6161
self::assertCount(0, $instance);

0 commit comments

Comments
 (0)