Skip to content

Commit 71bad8a

Browse files
committed
feat: refacting the arg rule parse logic
1 parent 39e9d62 commit 71bad8a

File tree

9 files changed

+328
-97
lines changed

9 files changed

+328
-97
lines changed

src/AbstractParser.php

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ abstract class AbstractParser implements ParserInterface
2323
*/
2424
protected $parsed = false;
2525

26+
/**
27+
* The usage description
28+
*
29+
* @var string
30+
*/
31+
protected $desc = '';
32+
2633
/**
2734
* The input flags
2835
*
@@ -75,6 +82,11 @@ abstract class AbstractParser implements ParserInterface
7582

7683
protected $ignoreUnknown = false;
7784

85+
/**
86+
* @var callable
87+
*/
88+
protected $helpRenderer;
89+
7890
/**
7991
* Class constructor.
8092
*
@@ -86,14 +98,16 @@ public function __construct(array $config = [])
8698
}
8799

88100
/**
101+
* @param array $rawArgs
102+
*
89103
* @return array
90104
*/
91-
protected function parseRawArgs(): array
105+
protected function parseRawArgs(array $rawArgs): array
92106
{
93107
$args = [];
94108

95109
// parse arguments
96-
foreach ($this->rawArgs as $arg) {
110+
foreach ($rawArgs as $arg) {
97111
// value specified inline (<arg>=<value>)
98112
if (strpos($arg, '=') > 0) {
99113
[$name, $value] = explode('=', $arg, 2);
@@ -112,6 +126,22 @@ protected function parseRawArgs(): array
112126
return $args;
113127
}
114128

129+
/**
130+
* @return callable
131+
*/
132+
public function getHelpRenderer(): callable
133+
{
134+
return $this->helpRenderer;
135+
}
136+
137+
/**
138+
* @param callable $helpRenderer
139+
*/
140+
public function setHelpRenderer(callable $helpRenderer): void
141+
{
142+
$this->helpRenderer = $helpRenderer;
143+
}
144+
115145
/**
116146
* @return array
117147
*/
@@ -120,6 +150,22 @@ public function getRequiredOpts(): array
120150
return $this->requiredOpts;
121151
}
122152

153+
/**
154+
* @return string
155+
*/
156+
public function getDesc(): string
157+
{
158+
return $this->desc;
159+
}
160+
161+
/**
162+
* @param string $desc
163+
*/
164+
public function setDesc(string $desc): void
165+
{
166+
$this->desc = $desc;
167+
}
168+
123169
/**
124170
* @return array
125171
*/

src/Contract/FlagInterface.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,11 @@ public function getName(): string;
3434
public function getHelpName(): string;
3535

3636
/**
37+
* @param bool $forHelp
38+
*
3739
* @return string
3840
*/
39-
public function getDesc(): string;
41+
public function getDesc(bool $forHelp = false): string;
4042

4143
/**
4244
* Get the flag value

src/Flag/AbstractFlag.php

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
use Toolkit\PFlag\Contract\ValidatorInterface;
1515
use Toolkit\PFlag\Exception\FlagException;
1616
use Toolkit\PFlag\FlagType;
17+
use Toolkit\Stdlib\Obj;
18+
use Toolkit\Stdlib\Str;
1719
use function is_array;
1820
use function is_bool;
1921

@@ -26,11 +28,15 @@
2628
abstract class AbstractFlag implements FlagInterface
2729
{
2830
/**
31+
* Flag name
32+
*
2933
* @var string
3034
*/
31-
protected $name;
35+
protected $name = '';
3236

3337
/**
38+
* Flag description
39+
*
3440
* @var string
3541
*/
3642
protected $desc = '';
@@ -91,6 +97,20 @@ public static function new(
9197
return new static($name, $desc, $type, $required, $default);
9298
}
9399

100+
/**
101+
* @param string $name
102+
* @param array $config
103+
*
104+
* @return static|Argument|Option
105+
*/
106+
public static function newByArray(string $name, array $config): self
107+
{
108+
$flag = new static($name);
109+
Obj::init($flag,$config);
110+
111+
return $flag;
112+
}
113+
94114
/**
95115
* Class constructor.
96116
*
@@ -262,14 +282,6 @@ public function setDefault($default): void
262282
$this->default = $default;
263283
}
264284

265-
/**
266-
* @return string
267-
*/
268-
public function getDesc(): string
269-
{
270-
return $this->desc;
271-
}
272-
273285
/**
274286
* @param string $desc
275287
*/

src/Flag/Argument.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
namespace Toolkit\PFlag\Flag;
1111

12+
use Toolkit\Stdlib\Str;
1213
use function sprintf;
1314

1415
/**
@@ -47,12 +48,27 @@ public function getNameMark(): string
4748
return sprintf('#%d%s', $this->index, $mark);
4849
}
4950

51+
/**
52+
* @param bool $forHelp
53+
*
54+
* @return string
55+
*/
56+
public function getDesc(bool $forHelp = false): string
57+
{
58+
$desc = $this->desc;
59+
if ($forHelp) {
60+
$desc = $desc ? Str::ucfirst($desc) : 'Argument ' . $this->index;
61+
}
62+
63+
return $desc;
64+
}
65+
5066
/**
5167
* @return string
5268
*/
5369
public function getHelpName(): string
5470
{
55-
return $this->name ?: 'ARG' . $this->index;
71+
return $this->name ?: 'arg' . $this->index;
5672
}
5773

5874
/**

src/Flag/Option.php

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Toolkit\Cli\Helper\FlagHelper;
1313
use Toolkit\PFlag\Exception\FlagException;
1414
use Toolkit\PFlag\FlagType;
15+
use Toolkit\Stdlib\Str;
1516
use function array_filter;
1617
use function array_map;
1718
use function array_unshift;
@@ -120,22 +121,37 @@ public function setShorts(array $shorts): void
120121
}
121122
}
122123

124+
/**
125+
* @param bool $forHelp
126+
*
127+
* @return string
128+
*/
129+
public function getDesc(bool $forHelp = false): string
130+
{
131+
$desc = $this->desc;
132+
if ($forHelp) {
133+
$desc = $desc ? Str::ucfirst($desc) : 'Option ' . $this->name;
134+
}
135+
136+
return $desc;
137+
}
138+
123139
/**
124140
* @return string
125141
*/
126142
public function getHelpName(): string
127143
{
128-
$names = [];
144+
$longs = [];
129145
if ($this->alias) {
130-
$names[] = $this->alias;
146+
$longs[] = $this->alias;
131147
}
132148

133-
$names[] = $this->name;
149+
$longs[] = $this->name;
134150

135151
// prepend '--'
136152
$nodes = array_map(static function (string $name) {
137153
return (strlen($name) > 1 ? '--' : '-') . $name;
138-
}, $names);
154+
}, $longs);
139155

140156
if ($this->shortcut) {
141157
array_unshift($nodes, $this->shortcut);

src/FlagUtil.php

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace Toolkit\PFlag;
4+
5+
use function array_map;
6+
use function implode;
7+
use function strlen;
8+
9+
/**
10+
* class FlagUtil
11+
*/
12+
class FlagUtil
13+
{
14+
/**
15+
* @param array $names
16+
*
17+
* @return string
18+
*/
19+
public static function buildOptHelpName(array $names): string
20+
{
21+
$nodes = array_map(static function (string $name) {
22+
return (strlen($name) > 1 ? '--' : '-') . $name;
23+
}, $names);
24+
25+
return implode(', ', $nodes);
26+
}
27+
28+
/**
29+
* @param int $val1
30+
* @param int $val2
31+
*
32+
* @return int
33+
*/
34+
public static function getMaxInt(int $val1, int $val2): int
35+
{
36+
return $val1 > $val2 ? $val1 : $val2;
37+
}
38+
}

src/Flags.php

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,6 @@ class Flags extends AbstractParser
3636
*/
3737
private static $std;
3838

39-
/**
40-
* @var callable
41-
*/
42-
private $helpRenderer;
43-
4439
/**
4540
* @var bool
4641
*/
@@ -270,7 +265,7 @@ public function reset(bool $clearDefined = false): void
270265
public function bindingArguments(): self
271266
{
272267
// parse arguments
273-
$args = $this->parseRawArgs();
268+
$args = $this->parseRawArgs($this->rawArgs);
274269

275270
// collect argument values
276271
foreach ($this->arguments as $index => $arg) {
@@ -294,22 +289,6 @@ public function bindingArguments(): self
294289
return $this;
295290
}
296291

297-
/**
298-
* @return callable
299-
*/
300-
public function getHelpRenderer(): callable
301-
{
302-
return $this->helpRenderer;
303-
}
304-
305-
/**
306-
* @param callable $helpRenderer
307-
*/
308-
public function setHelpRenderer(callable $helpRenderer): void
309-
{
310-
$this->helpRenderer = $helpRenderer;
311-
}
312-
313292
/**
314293
* @return bool
315294
*/

0 commit comments

Comments
 (0)