Skip to content

Commit 3227051

Browse files
committed
prof: add some helper methods from cli-utils
1 parent 5a746ff commit 3227051

File tree

8 files changed

+808
-12
lines changed

8 files changed

+808
-12
lines changed

src/CliApp.php

Lines changed: 722 additions & 0 deletions
Large diffs are not rendered by default.

src/Flag/AbstractFlag.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Toolkit\PFlag\Exception\FlagException;
1717
use Toolkit\PFlag\FlagsParser;
1818
use Toolkit\PFlag\FlagType;
19+
use Toolkit\PFlag\FlagUtil;
1920
use Toolkit\Stdlib\Obj;
2021
use Toolkit\Stdlib\OS;
2122
use function is_array;
@@ -303,7 +304,7 @@ public function getName(): string
303304
*/
304305
public function setName(string $name): void
305306
{
306-
if (!FlagHelper::isValidName($name)) {
307+
if (!FlagUtil::isValidName($name)) {
307308
throw new FlagException("invalid flag option name: $name");
308309
}
309310

src/Flag/Argument.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99

1010
namespace Toolkit\PFlag\Flag;
1111

12-
use Toolkit\Cli\Helper\FlagHelper;
1312
use Toolkit\PFlag\Exception\FlagException;
1413
use Toolkit\PFlag\FlagsParser;
14+
use Toolkit\PFlag\FlagUtil;
1515
use Toolkit\Stdlib\Str;
1616
use function sprintf;
1717

@@ -36,7 +36,7 @@ class Argument extends AbstractFlag
3636
public function setName(string $name): void
3737
{
3838
if ($name) {
39-
if (!FlagHelper::isValidName($name)) {
39+
if (!FlagUtil::isValidName($name)) {
4040
$mark = sprintf('#%d(%s)', $this->index, $name);
4141
throw new FlagException("invalid flag argument name: $mark");
4242
}

src/Flag/Option.php

Lines changed: 2 additions & 1 deletion
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\PFlag\FlagUtil;
1516
use Toolkit\Stdlib\Str;
1617
use function array_filter;
1718
use function array_map;
@@ -88,7 +89,7 @@ public function setAlias(string $alias): void
8889
return;
8990
}
9091

91-
if (!FlagHelper::isValidName($alias)) {
92+
if (!FlagUtil::isValidName($alias)) {
9293
throw new FlagException('invalid option alias: ' . $alias);
9394
}
9495

src/FlagType.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ public static function fmtBasicTypeValue(string $type, $value)
172172
break;
173173
case self::BOOL:
174174
if (is_string($value)) {
175-
$value = FlagHelper::str2bool($value);
175+
// $value = FlagHelper::str2bool($value);
176+
$value = Str::toBool2($value);
176177
} else {
177178
$value = (bool)$value;
178179
}

src/FlagUtil.php

Lines changed: 75 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,21 @@
55
use function array_map;
66
use function array_shift;
77
use function basename;
8+
use function escapeshellarg;
9+
use function explode;
810
use function implode;
911
use function is_numeric;
1012
use function ltrim;
13+
use function preg_match;
1114
use function strlen;
1215

1316
/**
1417
* class FlagUtil
1518
*/
1619
class FlagUtil
1720
{
21+
private static ?string $scriptName = null;
22+
1823
/**
1924
* @param array $names
2025
*
@@ -74,15 +79,81 @@ public static function getMaxInt(int $val1, int $val2): int
7479
}
7580

7681
/**
82+
* @param bool $refresh
83+
*
7784
* @return string
7885
*/
79-
public static function getBinName(): string
86+
public static function getBinName(bool $refresh = false): string
8087
{
81-
$script = '';
88+
if (!$refresh && self::$scriptName !== null) {
89+
return self::$scriptName;
90+
}
91+
92+
$scriptName = '';
8293
if (isset($_SERVER['argv']) && ($argv = $_SERVER['argv'])) {
83-
$script = array_shift($argv);
94+
$scriptFile = array_shift($argv);
95+
$scriptName = basename($scriptFile);
8496
}
8597

86-
return basename($script);
98+
self::$scriptName = $scriptName;
99+
return self::$scriptName;
100+
}
101+
102+
/**
103+
* check input is valid option value
104+
*
105+
* @param mixed $val
106+
*
107+
* @return bool
108+
*/
109+
public static function isOptionValue(mixed $val): bool
110+
{
111+
if ($val === false) {
112+
return false;
113+
}
114+
115+
// if is: '', 0
116+
if (!$val) {
117+
return true;
118+
}
119+
120+
// is not option name.
121+
if ($val[0] !== '-') {
122+
// ensure is option value.
123+
if (!str_contains($val, '=')) {
124+
return true;
125+
}
126+
127+
// is string value, but contains '='
128+
[$name,] = explode('=', $val, 2);
129+
130+
// named argument OR invalid: 'some = string'
131+
return false === self::isValidName($name);
132+
}
133+
134+
// is option name.
135+
return false;
136+
}
137+
138+
/**
139+
* @param string $name
140+
*
141+
* @return bool
142+
*/
143+
public static function isValidName(string $name): bool
144+
{
145+
return preg_match('#^[a-zA-Z_][\w-]{0,36}$#', $name) === 1;
146+
}
147+
148+
/**
149+
* Escapes a token through escape shell arg if it contains unsafe chars.
150+
*
151+
* @param string $token
152+
*
153+
* @return string
154+
*/
155+
public static function escapeToken(string $token): string
156+
{
157+
return preg_match('{^[\w-]+$}', $token) ? $token : escapeshellarg($token);
87158
}
88159
}

src/FlagsParser.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ protected function parseRawArgs(array $rawArgs): array
299299
[$name, $value] = explode('=', $arg, 2);
300300

301301
// ensure is valid name.
302-
if (FlagHelper::isValidName($name)) {
302+
if (FlagUtil::isValidName($name)) {
303303
$args[$name] = $value;
304304
} else {
305305
$args[] = $arg;

src/SFlags.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ public function doParse(array $flags): bool
420420
// check if next element is a descriptor or a value
421421
$next = current($flags);
422422
if ($hasVal === false && $isBool === false) {
423-
if (false === FlagHelper::isOptionValue($next)) {
423+
if (false === FlagUtil::isOptionValue($next)) {
424424
throw new FlagParseException("must provide value for the option: $p", 404);
425425
}
426426

@@ -655,7 +655,7 @@ protected function checkDefine(array $define, string $mark, string $kind = self:
655655
}
656656

657657
// check name.
658-
if ((self::KIND_OPT === $kind || $name) && !FlagHelper::isValidName($name)) {
658+
if ((self::KIND_OPT === $kind || $name) && !FlagUtil::isValidName($name)) {
659659
throw new FlagException("invalid flag $kind name: $mark");
660660
}
661661

0 commit comments

Comments
 (0)