forked from Respect/Stringifier
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCompositeHandler.php
More file actions
96 lines (81 loc) · 3.01 KB
/
CompositeHandler.php
File metadata and controls
96 lines (81 loc) · 3.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?php
/*
* This file is part of Respect/Stringifier.
* Copyright (c) Henrique Moody <henriquemoody@gmail.com>
* SPDX-License-Identifier: MIT
*/
declare(strict_types=1);
namespace Respect\Stringifier\Handlers;
use DateTimeInterface;
use Respect\Stringifier\Handler;
use Respect\Stringifier\Quoters\StandardQuoter;
use function array_unshift;
final class CompositeHandler implements Handler
{
private const int MAXIMUM_DEPTH = 3;
private const int MAXIMUM_NUMBER_OF_ITEMS = 5;
private const int MAXIMUM_NUMBER_OF_PROPERTIES = self::MAXIMUM_NUMBER_OF_ITEMS;
private const int MAXIMUM_LENGTH = 120;
/** @var array<Handler> */
private array $handlers = [];
public function __construct(Handler ...$handlers)
{
$this->handlers = $handlers;
}
public static function create(): self
{
$quoter = new StandardQuoter(self::MAXIMUM_LENGTH);
$handler = new self(
new InfiniteNumberHandler($quoter),
new NotANumberHandler($quoter),
new ResourceHandler($quoter),
new BoolHandler($quoter),
new NullHandler($quoter),
$jsonEncodableHandler = new JsonEncodableHandler(),
);
$handler->prependHandler(
$arrayHandler = new ArrayHandler(
$handler,
$quoter,
self::MAXIMUM_DEPTH,
self::MAXIMUM_NUMBER_OF_ITEMS,
),
);
$handler->prependHandler(
new ObjectHandler(
$handler,
$quoter,
self::MAXIMUM_DEPTH,
self::MAXIMUM_NUMBER_OF_PROPERTIES,
),
);
$handler->prependHandler(new CallableHandler($handler, $quoter));
$handler->prependHandler(
new FiberObjectHandler(new CallableHandler($handler, $quoter, closureOnly: false), $quoter),
);
$handler->prependHandler(new EnumerationHandler($quoter));
$handler->prependHandler(new ObjectWithDebugInfoHandler($arrayHandler, $quoter));
$handler->prependHandler(new ArrayObjectHandler($arrayHandler, $quoter));
$handler->prependHandler(new JsonSerializableObjectHandler($jsonEncodableHandler, $quoter));
$handler->prependHandler(new StringableObjectHandler($jsonEncodableHandler, $quoter));
$handler->prependHandler(new ThrowableObjectHandler($jsonEncodableHandler, $quoter));
$handler->prependHandler(new DateTimeHandler($quoter, DateTimeInterface::ATOM));
$handler->prependHandler(new IteratorObjectHandler($handler, $quoter));
return $handler;
}
public function prependHandler(Handler $handler): void
{
array_unshift($this->handlers, $handler);
}
public function handle(mixed $raw, int $depth): string|null
{
foreach ($this->handlers as $handler) {
$string = $handler->handle($raw, $depth);
if ($string === null) {
continue;
}
return $string;
}
return null;
}
}