-
Notifications
You must be signed in to change notification settings - Fork 85
Expand file tree
/
Copy pathCodeGenerator.php
More file actions
85 lines (73 loc) · 2.34 KB
/
CodeGenerator.php
File metadata and controls
85 lines (73 loc) · 2.34 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
<?php
/**
* ua-parser
*
* Copyright (c) 2011-2012 Dave Olsen, http://dmolsen.com
*
* Released under the MIT license
*/
namespace UAParser\Util;
use function array_keys;
use function array_map;
use function array_reduce;
use function array_values;
use function is_scalar;
use function is_string;
use function str_repeat;
use function var_export;
class CodeGenerator
{
public function generateArray(array $array): string
{
$createReducer = static function (bool $multi = true, int $indentation = 1) use (&$createReducer) {
return static function(string $source, array $element) use ($indentation, $multi, $createReducer) {
[$key, $value] = $element;
if ($multi) {
$source .= self::indent($indentation);
}
$source .= self::generateKey($key);
if (is_scalar($value) || is_null($value)) {
$source .= var_export($value, true);
if ($multi) {
$source .= ",\n";
}
return $source;
}
$source .= "[";
$nextMulti = count($value) > 1;
if ($nextMulti) {
$source .= "\n";
}
$source .= array_reduce(self::toPairs($value), $createReducer($nextMulti, $indentation + 1), '');
if ($nextMulti) {
$source .= self::indent($indentation);
}
$source .= "]";
if ($multi) {
$source .= ",\n";
}
return $source;
};
};
$multi = count($array) > 1;
return array_reduce(self::toPairs($array), $createReducer($multi, 1), "[" . ($multi ? "\n" : '')) . '];';
}
private static function generateKey($key): string
{
return is_string($key) ? var_export($key, true) . ' => ' : '';
}
private static function indent(int $indentation): string
{
return str_repeat(' ', $indentation * 4);
}
private static function toPairs(array $map): array
{
return array_map(
static function ($key, $value): array {
return [$key, $value];
},
array_keys($map),
array_values($map)
);
}
}