forked from phpbrew/phpbrew
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathVariantParser.php
95 lines (76 loc) · 2.3 KB
/
VariantParser.php
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
<?php
namespace PhpBrew;
class VariantParser
{
/**
* @param string[] $args
*
* @return array
*
* @throws InvalidVariantSyntaxException
*/
public static function parseCommandArguments(array $args)
{
$extra = array();
$enabledVariants = array();
$disabledVariants = array();
while (true) {
$arg = array_shift($args);
if ($arg === null) {
break;
}
if ($arg === '') {
throw new InvalidVariantSyntaxException('Variant cannot be empty');
}
if ($arg === '--') {
$extra = $args;
break;
}
$operator = substr($arg, 0, 1);
switch ($operator) {
case '+':
$target =& $enabledVariants;
break;
case '-':
$target =& $disabledVariants;
break;
default:
throw new InvalidVariantSyntaxException('Variant must start with a + or -');
}
$variant = substr($arg, 1);
list($name, $value) = array_pad(explode('=', $variant, 2), 2, null);
if ($name === '') {
throw new InvalidVariantSyntaxException('Variant name cannot be empty');
}
$target[$name] = $value;
}
return array(
'enabled_variants' => $enabledVariants,
'disabled_variants' => $disabledVariants,
'extra_options' => $extra,
);
}
/**
* Reveal the variants info to command arguments.
*/
public static function revealCommandArguments(array $info)
{
$args = array();
foreach ($info['enabled_variants'] as $k => $v) {
$arg = '+' . $k;
if (!is_bool($v)) {
$arg .= '=' . $v;
}
$args[] = $arg;
}
if (!empty($info['disabled_variants'])) {
foreach ($info['disabled_variants'] as $k => $_) {
$args[] = '-' . $k;
}
}
if (!empty($info['extra_options'])) {
$args = array_merge($args, array('--'), $info['extra_options']);
}
return implode(' ', $args);
}
}