Skip to content

Commit 6bb34fc

Browse files
authored
Wrap string being parsed in helper object
* Wrap string being parsed in helper object * Drop PHP 7 support * PHP 8.1+ updates
1 parent 0447404 commit 6bb34fc

21 files changed

+442
-302
lines changed

.github/workflows/php.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
strategy:
1818
fail-fast: false
1919
matrix:
20-
php-versions: ['7.3', '7.4', '8.0', '8.1', '8.2', '8.3']
20+
php-versions: ['8.1', '8.2', '8.3']
2121
experimental: [false]
2222
env:
2323
code-coverage-version: '8.3' # Most recent stable PHP version.

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
"phpmd": "phpmd src,tests ansi phpmd.ruleset.xml"
3030
},
3131
"require": {
32-
"php": "^7.3 || ^8.0",
32+
"php": "^8.1",
3333
"ext-json": "*"
3434
},
3535
"require-dev": {

phpstan.neon.dist

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,8 @@ parameters:
77
paths:
88
- src
99
- tests
10-
10+
treatPhpDocTypesAsCertain: false
1111
universalObjectCratesClasses:
1212
- gapple\StructuredFields\Dictionary
1313
- gapple\StructuredFields\Parameters
1414

15-
featureToggles:
16-
readOnlyByPhpDoc: true
17-
18-
ignoreErrors:
19-
-
20-
message: '#Unreachable statement - code above always terminates.#'
21-
path: src/TupleTrait.php

src/Bytes.php

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,8 @@
66

77
class Bytes
88
{
9-
/**
10-
* @var string
11-
* @readonly
12-
*/
13-
private $value;
14-
15-
public function __construct(string $value)
9+
public function __construct(private readonly string $value)
1610
{
17-
$this->value = $value;
1811
}
1912

2013
public function __toString(): string

src/Date.php

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,8 @@
66

77
class Date
88
{
9-
/**
10-
* @var int
11-
* @readonly
12-
*/
13-
private $value;
14-
15-
public function __construct(int $value)
9+
public function __construct(private readonly int $value)
1610
{
17-
$this->value = $value;
1811
}
1912

2013
public function toInt(): int

src/Dictionary.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ class Dictionary implements \IteratorAggregate
1212
/**
1313
* @var array<string, TupleInterface|array{mixed, object}>
1414
*/
15-
protected $value = [];
15+
protected array $value = [];
1616

1717
/**
1818
* @param array<mixed> $array
1919
* @return Dictionary
2020
*/
21-
public static function fromArray(array $array): Dictionary
21+
public static function fromArray(array $array): self
2222
{
2323
$dictionary = new self();
2424

@@ -40,7 +40,7 @@ public static function fromArray(array $array): Dictionary
4040
* @param string $name
4141
* @return TupleInterface|array{mixed, object}|null
4242
*/
43-
public function __get(string $name)
43+
public function __get(string $name): mixed
4444
{
4545
return $this->value[$name] ?? null;
4646
}
@@ -50,7 +50,7 @@ public function __get(string $name)
5050
* @param TupleInterface|array{mixed, object} $value
5151
* @return void
5252
*/
53-
public function __set(string $name, $value)
53+
public function __set(string $name, mixed $value): void
5454
{
5555
$this->value[$name] = $value;
5656
}

src/DisplayString.php

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,8 @@
66

77
class DisplayString
88
{
9-
/**
10-
* @var string
11-
* @readonly
12-
*/
13-
private $value;
14-
15-
public function __construct(string $value)
9+
public function __construct(private readonly string $value)
1610
{
17-
$this->value = $value;
1811
}
1912

2013
public function __toString(): string

src/InnerList.php

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,7 @@ public function __construct(array $value, ?object $parameters = null)
1717
array_walk($value, [$this, 'validateItemType']);
1818

1919
$this->value = $value;
20-
21-
if (is_null($parameters)) {
22-
$this->parameters = new Parameters();
23-
} else {
24-
$this->parameters = $parameters;
25-
}
20+
$this->parameters = $parameters ?? new Parameters();
2621
}
2722

2823
/**
@@ -37,8 +32,9 @@ public static function fromArray(array $array): InnerList
3732
array_walk($array, function (&$item) {
3833
if (!$item instanceof TupleInterface) {
3934
$item = new Item($item);
35+
} elseif ($item instanceof InnerList) {
36+
throw new \InvalidArgumentException('InnerList objects cannot be nested');
4037
}
41-
self::validateItemType($item);
4238
});
4339

4440
/** @var TupleInterface[] $array */
@@ -49,7 +45,7 @@ public static function fromArray(array $array): InnerList
4945
* @param TupleInterface|array{mixed, object} $value
5046
* @return void
5147
*/
52-
private static function validateItemType($value): void
48+
private static function validateItemType(mixed $value): void
5349
{
5450
if (is_object($value)) {
5551
if (!($value instanceof TupleInterface)) {
@@ -61,7 +57,7 @@ private static function validateItemType($value): void
6157
throw new \InvalidArgumentException('InnerList objects cannot be nested');
6258
}
6359
} elseif (is_array($value)) {
64-
if (count($value) != 2) { // @phpstan-ignore-line
60+
if (count($value) != 2) {
6561
throw new \InvalidArgumentException();
6662
}
6763
} else {

src/Item.php

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,9 @@ class Item implements TupleInterface
1212
* @param mixed $value
1313
* @param object|null $parameters
1414
*/
15-
public function __construct($value, ?object $parameters = null)
15+
public function __construct(mixed $value, ?object $parameters = null)
1616
{
1717
$this->value = $value;
18-
19-
if (is_null($parameters)) {
20-
$this->parameters = new Parameters();
21-
} else {
22-
$this->parameters = $parameters;
23-
}
18+
$this->parameters = $parameters ?? new Parameters();
2419
}
2520
}

src/OuterList.php

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class OuterList implements \IteratorAggregate, \ArrayAccess
1515
*
1616
* @var array<TupleInterface|array{mixed, object}>
1717
*/
18-
public $value;
18+
public array $value;
1919

2020
/**
2121
* @param array<TupleInterface|array{mixed, object}> $value
@@ -35,26 +35,25 @@ public function __construct(array $value = [])
3535
*/
3636
public static function fromArray(array $array): OuterList
3737
{
38-
$list = new self();
39-
foreach ($array as $value) {
40-
if (!$value instanceof TupleInterface) {
41-
if (is_array($value)) {
42-
$value = InnerList::fromArray($value);
38+
array_walk($array, function (&$item) {
39+
if (!$item instanceof TupleInterface) {
40+
if (is_array($item)) {
41+
$item = InnerList::fromArray($item);
4342
} else {
44-
$value = new Item($value);
43+
$item = new Item($item);
4544
}
4645
}
47-
$list[] = $value;
48-
}
46+
});
4947

50-
return $list;
48+
/** @var TupleInterface[] $array */
49+
return new self($array);
5150
}
5251

5352
/**
5453
* @param TupleInterface|array{mixed, object} $value
5554
* @return void
5655
*/
57-
private static function validateItemType($value): void
56+
private static function validateItemType(mixed $value): void
5857
{
5958
if (is_object($value)) {
6059
if (!($value instanceof TupleInterface)) {
@@ -63,7 +62,7 @@ private static function validateItemType($value): void
6362
);
6463
}
6564
} elseif (is_array($value)) {
66-
if (count($value) != 2) { // @phpstan-ignore-line
65+
if (count($value) != 2) {
6766
throw new \InvalidArgumentException();
6867
}
6968
} else {
@@ -87,10 +86,10 @@ public function offsetExists($offset): bool
8786

8887
/**
8988
* @param int $offset
90-
* @return TupleInterface|array{mixed, object}|null
89+
* @return mixed
90+
* @phpstan-return TupleInterface|array{mixed, object}|null
9191
*/
92-
#[\ReturnTypeWillChange]
93-
public function offsetGet($offset)
92+
public function offsetGet($offset): mixed
9493
{
9594
return $this->value[$offset] ?? null;
9695
}

src/Parameters.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@ class Parameters implements \IteratorAggregate
1212
/**
1313
* @var array<string, mixed>
1414
*/
15-
protected $value = [];
15+
protected array $value = [];
1616

1717
/**
18-
* @param array<mixed> $array
18+
* @param array<string, mixed> $array
1919
* @return Parameters
2020
*/
21-
public static function fromArray(array $array): Parameters
21+
public static function fromArray(array $array): self
2222
{
2323
$parameters = new self();
2424
$parameters->value = $array;
@@ -30,7 +30,7 @@ public static function fromArray(array $array): Parameters
3030
* @param string $name
3131
* @return mixed|null
3232
*/
33-
public function __get(string $name)
33+
public function __get(string $name): mixed
3434
{
3535
return $this->value[$name] ?? null;
3636
}
@@ -40,7 +40,7 @@ public function __get(string $name)
4040
* @param mixed $value
4141
* @return void
4242
*/
43-
public function __set(string $name, $value)
43+
public function __set(string $name, mixed $value): void
4444
{
4545
$this->value[$name] = $value;
4646
}

0 commit comments

Comments
 (0)