@@ -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