Skip to content

Commit 8e6face

Browse files
committed
refactor: clean up serializer and caster matching
1 parent b6c4302 commit 8e6face

37 files changed

+309
-237
lines changed

packages/database/src/Casters/DataTransferObjectCaster.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@
22

33
namespace Tempest\Database\Casters;
44

5-
use Closure;
65
use Tempest\Core\Priority;
76
use Tempest\Database\DatabaseContext;
87
use Tempest\Mapper\Attributes\Context;
98
use Tempest\Mapper\Caster;
109
use Tempest\Mapper\Context as MapperContext;
10+
use Tempest\Mapper\DynamicCaster;
1111
use Tempest\Mapper\Exceptions\ValueCouldNotBeCast;
1212
use Tempest\Mapper\MapperConfig;
1313
use Tempest\Mapper\SerializeAs;
14+
use Tempest\Reflection\PropertyReflector;
1415
use Tempest\Reflection\TypeReflector;
1516
use Tempest\Support\Arr;
1617
use Tempest\Support\Json;
@@ -19,16 +20,20 @@
1920

2021
#[Priority(Priority::HIGHEST)]
2122
#[Context(DatabaseContext::class)]
22-
final readonly class DataTransferObjectCaster implements Caster
23+
final readonly class DataTransferObjectCaster implements Caster, DynamicCaster
2324
{
2425
public function __construct(
2526
private MapperConfig $mapperConfig,
2627
private MapperContext $context,
2728
) {}
2829

29-
public static function for(): Closure
30+
public static function accepts(PropertyReflector|TypeReflector $type): bool
3031
{
31-
return fn (TypeReflector $type) => $type->isClass() && $type->asClass()->getAttribute(SerializeAs::class);
32+
$type = $type instanceof PropertyReflector
33+
? $type->getType()
34+
: $type;
35+
36+
return $type->isClass() && $type->asClass()->getAttribute(SerializeAs::class) !== null;
3237
}
3338

3439
public function cast(mixed $input): mixed

packages/database/src/Casters/EncryptedCaster.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,6 @@ public function __construct(
1515
private Encrypter $encrypter,
1616
) {}
1717

18-
public static function for(): false
19-
{
20-
return false;
21-
}
22-
2318
public function cast(mixed $input): ?string
2419
{
2520
if ($input === null) {

packages/database/src/Casters/PrimaryKeyCaster.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,20 @@
77
use Tempest\Core\Priority;
88
use Tempest\Database\PrimaryKey;
99
use Tempest\Mapper\Caster;
10+
use Tempest\Mapper\DynamicCaster;
11+
use Tempest\Reflection\PropertyReflector;
12+
use Tempest\Reflection\TypeReflector;
1013

1114
#[Priority(Priority::HIGHEST)]
12-
final readonly class PrimaryKeyCaster implements Caster
15+
final readonly class PrimaryKeyCaster implements Caster, DynamicCaster
1316
{
14-
public static function for(): string
17+
public static function accepts(PropertyReflector|TypeReflector $input): bool
1518
{
16-
return PrimaryKey::class;
19+
$type = $input instanceof PropertyReflector
20+
? $input->getType()
21+
: $input;
22+
23+
return $type->matches(PrimaryKey::class);
1724
}
1825

1926
public function cast(mixed $input): PrimaryKey

packages/database/src/Serializers/BooleanSerializer.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,26 @@
77
use Tempest\Database\Config\DatabaseDialect;
88
use Tempest\Database\DatabaseContext;
99
use Tempest\Mapper\Attributes\Context;
10+
use Tempest\Mapper\DynamicSerializer;
1011
use Tempest\Mapper\Exceptions\ValueCouldNotBeSerialized;
1112
use Tempest\Mapper\Serializer;
13+
use Tempest\Reflection\PropertyReflector;
14+
use Tempest\Reflection\TypeReflector;
1215

1316
#[Context(DatabaseContext::class)]
14-
final class BooleanSerializer implements Serializer
17+
final class BooleanSerializer implements Serializer, DynamicSerializer
1518
{
1619
public function __construct(
1720
private DatabaseContext $context,
1821
) {}
1922

20-
public static function for(): array
23+
public static function accepts(PropertyReflector|TypeReflector $type): bool
2124
{
22-
return ['bool', 'boolean'];
25+
$type = $type instanceof PropertyReflector
26+
? $type->getType()
27+
: $type;
28+
29+
return $type->getName() === 'bool' || $type->getName() === 'boolean';
2330
}
2431

2532
public function serialize(mixed $input): string

packages/database/src/Serializers/DataTransferObjectSerializer.php

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
namespace Tempest\Database\Serializers;
44

55
use BackedEnum;
6-
use Closure;
76
use JsonSerializable;
87
use Tempest\Core\Priority;
98
use Tempest\Database\DatabaseContext;
109
use Tempest\Mapper\Attributes\Context;
10+
use Tempest\Mapper\DynamicSerializer;
1111
use Tempest\Mapper\Exceptions\ValueCouldNotBeSerialized;
1212
use Tempest\Mapper\MapperConfig;
1313
use Tempest\Mapper\SerializeAs;
@@ -21,15 +21,19 @@
2121

2222
#[Priority(Priority::HIGHEST)]
2323
#[Context(DatabaseContext::class)]
24-
final readonly class DataTransferObjectSerializer implements Serializer
24+
final readonly class DataTransferObjectSerializer implements Serializer, DynamicSerializer
2525
{
2626
public function __construct(
2727
private MapperConfig $mapperConfig,
2828
) {}
2929

30-
public static function for(): Closure
30+
public static function accepts(PropertyReflector|TypeReflector $type): bool
3131
{
32-
return fn (TypeReflector $type) => $type->isClass() && $type->asClass()->getAttribute(SerializeAs::class);
32+
$type = $type instanceof PropertyReflector
33+
? $type->getType()
34+
: $type;
35+
36+
return $type->isClass() && $type->asClass()->getAttribute(SerializeAs::class) !== null;
3337
}
3438

3539
public function serialize(mixed $input): array|string

packages/database/src/Serializers/DateTimeSerializer.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,22 @@
1010
use Tempest\DateTime\DateTimeInterface;
1111
use Tempest\DateTime\FormatPattern;
1212
use Tempest\Mapper\Attributes\Context;
13+
use Tempest\Mapper\DynamicSerializer;
1314
use Tempest\Mapper\Exceptions\ValueCouldNotBeSerialized;
1415
use Tempest\Mapper\Serializer;
16+
use Tempest\Reflection\PropertyReflector;
17+
use Tempest\Reflection\TypeReflector;
1518

1619
#[Context(DatabaseContext::class)]
17-
final readonly class DateTimeSerializer implements Serializer
20+
final readonly class DateTimeSerializer implements Serializer, DynamicSerializer
1821
{
19-
public static function for(): array
22+
public static function accepts(PropertyReflector|TypeReflector $type): bool
2023
{
21-
return [DateTime::class, DateTimeInterface::class, NativeDateTimeInterface::class];
24+
$type = $type instanceof PropertyReflector
25+
? $type->getType()
26+
: $type;
27+
28+
return $type->matches(DateTime::class) || $type->matches(DateTimeInterface::class) || $type->matches(NativeDateTimeInterface::class);
2229
}
2330

2431
public function serialize(mixed $input): string

packages/database/src/Serializers/EncryptedSerializer.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,6 @@ public function __construct(
1414
private Encrypter $encrypter,
1515
) {}
1616

17-
public static function for(): false
18-
{
19-
return false;
20-
}
21-
2217
public function serialize(mixed $input): array|string
2318
{
2419
if (! is_string($input)) {

packages/database/src/Serializers/HashedSerializer.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@ public function __construct(
1111
private PasswordHasher $passwordHasher,
1212
) {}
1313

14-
public static function for(): false
15-
{
16-
return false;
17-
}
18-
1914
public function serialize(mixed $input): string
2015
{
2116
if (! is_string($input)) {

packages/database/src/Serializers/PrimaryKeySerializer.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,21 @@
33
namespace Tempest\Database\Serializers;
44

55
use Tempest\Database\PrimaryKey;
6+
use Tempest\Mapper\DynamicSerializer;
67
use Tempest\Mapper\Exceptions\ValueCouldNotBeSerialized;
78
use Tempest\Mapper\Serializer;
9+
use Tempest\Reflection\PropertyReflector;
10+
use Tempest\Reflection\TypeReflector;
811

9-
final class PrimaryKeySerializer implements Serializer
12+
final class PrimaryKeySerializer implements Serializer, DynamicSerializer
1013
{
11-
public static function for(): string
14+
public static function accepts(PropertyReflector|TypeReflector $input): bool
1215
{
13-
return PrimaryKey::class;
16+
$type = $input instanceof PropertyReflector
17+
? $input->getType()
18+
: $input;
19+
20+
return $type->matches(PrimaryKey::class);
1421
}
1522

1623
public function serialize(mixed $input): string|int

packages/mapper/src/Caster.php

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,8 @@
44

55
namespace Tempest\Mapper;
66

7-
use Closure;
8-
use Tempest\Reflection\TypeReflector;
9-
107
interface Caster
118
{
12-
/**
13-
* Declares what this caster can handle.
14-
*
15-
* Can return:
16-
* - A string type name: 'bool', 'int', 'string', etc.
17-
* - A class name: DateTime::class
18-
* - A Closure for complex matching: fn (TypeReflector $type) => $type->matches(SomeClass::class)
19-
*
20-
* @return false|string|array|(Closure(TypeReflector):bool)
21-
*/
22-
public static function for(): false|array|string|Closure;
23-
249
/**
2510
* Creates an object or a scalar value from the given input.
2611
*/

0 commit comments

Comments
 (0)