Skip to content

Commit 6589035

Browse files
committed
Improve JsonValuePrinter
1 parent 3411074 commit 6589035

File tree

1 file changed

+124
-12
lines changed

1 file changed

+124
-12
lines changed

src/Runtime/Value/JsonValuePrinter.php

Lines changed: 124 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,117 @@ public function __construct(
1515
private readonly int $maxDepth = self::DEFAULT_MAX_DEPTH,
1616
) {}
1717

18-
public function print(mixed $value, int $depth = 0): string
18+
public function print(mixed $value): string
19+
{
20+
return $this->printMixed($value, 0);
21+
}
22+
23+
/**
24+
* @param int<0, max> $depth
25+
* @return non-empty-string
26+
*/
27+
private function printMixed(mixed $value, int $depth): string
1928
{
2029
return match (true) {
21-
$value === true => 'true',
22-
$value === false => 'false',
23-
$value === null => 'null',
24-
\is_string($value) => \sprintf('"%s"', \addcslashes($value, '"')),
30+
$value === true => $this->printTrue(),
31+
$value === false => $this->printFalse(),
32+
$value === null => $this->printNull(),
33+
\is_string($value) => $this->printString($value),
2534
\is_float($value) => $this->printFloat($value),
26-
\is_scalar($value),
27-
$value instanceof \Stringable => (string) $value,
35+
\is_int($value) => $this->printInt($value),
36+
\is_resource($value) => $this->printResource($value),
2837
\is_array($value) => $this->printArray($value, $depth),
38+
$value instanceof \BackedEnum => $this->printBackedEnum($value, $depth),
39+
$value instanceof \UnitEnum => $this->printUnitEnum($value),
2940
\is_object($value) => $this->printObject($value, $depth),
30-
default => \get_debug_type($value),
41+
default => $this->printOther($value),
3142
};
3243
}
3344

45+
/**
46+
* @return non-empty-string
47+
*/
48+
private function printInt(int $value): string
49+
{
50+
return (string) $value;
51+
}
52+
53+
/**
54+
* @return non-empty-string
55+
*/
56+
private function printOther(mixed $value): string
57+
{
58+
/** @var non-empty-string */
59+
return \get_debug_type($value);
60+
}
61+
62+
/**
63+
* @param resource $resource
64+
* @return non-empty-string
65+
*/
66+
private function printResource(mixed $resource): string
67+
{
68+
return (string) \get_resource_id($resource);
69+
}
70+
71+
/**
72+
* @return non-empty-string
73+
*/
74+
private function printTrue(): string
75+
{
76+
return 'true';
77+
}
78+
79+
/**
80+
* @return non-empty-string
81+
*/
82+
private function printFalse(): string
83+
{
84+
return 'false';
85+
}
86+
87+
/**
88+
* @return non-empty-string
89+
*/
90+
private function printNull(): string
91+
{
92+
return 'null';
93+
}
94+
95+
/**
96+
* @return non-empty-string
97+
*/
98+
private function printString(string $value): string
99+
{
100+
$formatted = \strtr($value, [
101+
"\n" => '\n',
102+
"\r" => '\r',
103+
"\t" => '\t',
104+
]);
105+
106+
return \sprintf('"%s"', \addcslashes($formatted, '"'));
107+
}
108+
109+
/**
110+
* @return non-empty-string
111+
*/
112+
private function printUnitEnum(\UnitEnum $case): string
113+
{
114+
return $this->printString($case->name);
115+
}
116+
117+
/**
118+
* @param int<0, max> $depth
119+
* @return non-empty-string
120+
*/
121+
private function printBackedEnum(\BackedEnum $case, int $depth): string
122+
{
123+
return $this->printMixed($case->value, $depth);
124+
}
125+
126+
/**
127+
* @return non-empty-string
128+
*/
34129
private function printFloat(float $value): string
35130
{
36131
return match (true) {
@@ -45,8 +140,21 @@ private function printFloat(float $value): string
45140
};
46141
}
47142

48-
private function printObject(object $object, int $depth = 0): string
143+
/**
144+
* @param int<0, max> $depth
145+
*
146+
* @return non-empty-string
147+
*/
148+
private function printObject(object $object, int $depth): string
49149
{
150+
if ($object instanceof \Stringable) {
151+
$result = (string) $object;
152+
153+
if ($result === '') {
154+
return '{}';
155+
}
156+
}
157+
50158
if ($depth >= $this->maxDepth) {
51159
return '{...}';
52160
}
@@ -62,6 +170,7 @@ private function printObject(object $object, int $depth = 0): string
62170

63171
/**
64172
* @param array<array-key, mixed> $values
173+
* @param int<0, max> $depth
65174
*
66175
* @return non-empty-string
67176
*/
@@ -85,6 +194,7 @@ private function printArray(array $values, int $depth): string
85194

86195
/**
87196
* @param array<array-key, mixed> $values
197+
* @param int<0, max> $depth
88198
*
89199
* @return list<string>
90200
*/
@@ -95,8 +205,8 @@ private function computeKeyValValues(array $values, int $depth): array
95205

96206
foreach ($values as $key => $value) {
97207
$result[] = \vsprintf('%s: %s', [
98-
$this->print($key, $depth),
99-
$this->print($value, $depth),
208+
$this->printMixed($key, $depth),
209+
$this->printMixed($value, $depth),
100210
]);
101211

102212
if (++$index >= $this->maxItemsCount) {
@@ -109,6 +219,7 @@ private function computeKeyValValues(array $values, int $depth): array
109219

110220
/**
111221
* @param list<mixed> $values
222+
* @param int<0, max> $depth
112223
*
113224
* @return non-empty-string
114225
*/
@@ -128,6 +239,7 @@ private function printList(array $values, int $depth): string
128239

129240
/**
130241
* @param list<mixed> $values
242+
* @param int<0, max> $depth
131243
*
132244
* @return list<string>
133245
*/
@@ -137,7 +249,7 @@ private function computeListValues(array $values, int $depth): array
137249
$index = 0;
138250

139251
foreach ($values as $value) {
140-
$result[] = $this->print($value, $depth);
252+
$result[] = $this->printMixed($value, $depth);
141253

142254
if (++$index >= $this->maxItemsCount) {
143255
break;

0 commit comments

Comments
 (0)