Skip to content

Commit 4eb0813

Browse files
committed
add new exception class, add new setting for parse args
1 parent 37bcfaa commit 4eb0813

File tree

7 files changed

+321
-141
lines changed

7 files changed

+321
-141
lines changed

src/AbstractFlags.php

Lines changed: 71 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ abstract class AbstractFlags implements ParserInterface
4747

4848
public const STATUS_OK = 0;
4949

50-
public const STATUS_ERR = 1;
50+
public const STATUS_ARG = 1;
5151

52-
public const STATUS_ARG = 2;
52+
public const STATUS_HELP = 2; // found `-h|--help` flag
5353

54-
public const STATUS_HELP = 3; // found `-h|--help` flag
54+
// public const STATUS_ERR = 3;
5555

5656
/**
5757
* Special short option style
@@ -184,10 +184,29 @@ abstract class AbstractFlags implements ParserInterface
184184

185185
// -------------------- settings for parse argument --------------------
186186

187+
/**
188+
* Has array argument
189+
*
190+
* @var bool
191+
*/
192+
protected $arrayArg = false;
193+
194+
/**
195+
* Has optional argument
196+
*
197+
* @var bool
198+
*/
199+
protected $optionalArg = false;
200+
201+
/**
202+
* @var bool
203+
*/
204+
protected $autoBindArgs = true;
205+
187206
/**
188207
* @var bool
189208
*/
190-
private $autoBindArgs = true;
209+
protected $strictCheckArgs = false;
191210

192211
// -------------------- settings for render help --------------------
193212

@@ -569,6 +588,22 @@ public function getRequiredOpts(): array
569588
return $this->requiredOpts;
570589
}
571590

591+
/**
592+
* @return string
593+
*/
594+
public function getName(): string
595+
{
596+
return $this->getScriptName();
597+
}
598+
599+
/**
600+
* @param string $name
601+
*/
602+
public function setName(string $name): void
603+
{
604+
$this->setScriptName($name);
605+
}
606+
572607
/**
573608
* @return string
574609
*/
@@ -657,6 +692,22 @@ public function setSkipOnUndefined(bool $skipOnUndefined): void
657692
$this->skipOnUndefined = $skipOnUndefined;
658693
}
659694

695+
/**
696+
* @return bool
697+
*/
698+
public function hasOptionalArg(): bool
699+
{
700+
return $this->optionalArg;
701+
}
702+
703+
/**
704+
* @return bool
705+
*/
706+
public function hasArrayArg(): bool
707+
{
708+
return $this->arrayArg;
709+
}
710+
660711
/**
661712
* @return bool
662713
*/
@@ -673,6 +724,22 @@ public function setAutoBindArgs(bool $autoBindArgs): void
673724
$this->autoBindArgs = $autoBindArgs;
674725
}
675726

727+
/**
728+
* @return bool
729+
*/
730+
public function isStrictCheckArgs(): bool
731+
{
732+
return $this->strictCheckArgs;
733+
}
734+
735+
/**
736+
* @param bool $strictCheckArgs
737+
*/
738+
public function setStrictCheckArgs(bool $strictCheckArgs): void
739+
{
740+
$this->strictCheckArgs = $strictCheckArgs;
741+
}
742+
676743
/**
677744
* @return string
678745
*/

src/Concern/RuleParserTrait.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,9 @@ protected function parseRule($rule, string $name = '', int $index = 0, bool $isO
135135
} else { // only type name.
136136
$item['type'] = $rule;
137137
}
138-
} else { // eg: 'type;desc;required;default;shorts'
139-
$nodes = Str::splitTrimmed($rule, $sep, 5);
138+
} else { // has multi node. eg: 'type;desc;required;default;shorts'
139+
$limit = $isOption ? 5 : 4;
140+
$nodes = Str::splitTrimmed($rule, $sep, $limit);
140141

141142
// first is type.
142143
$item['type'] = $nodes[0];
@@ -156,8 +157,8 @@ protected function parseRule($rule, string $name = '', int $index = 0, bool $isO
156157
$item['default'] = FlagType::str2ArrValue($nodes[0], $nodes[3]);
157158
}
158159

159-
// shorts
160-
if (isset($nodes[4]) && $nodes[4] !== '') {
160+
// for option: shorts
161+
if ($isOption && isset($nodes[4]) && $nodes[4] !== '') {
161162
$shortsFromRule = Str::explode($nodes[4], ',');
162163
}
163164
}

src/Exception/FlagParseException.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace Toolkit\PFlag\Exception;
4+
5+
use Throwable;
6+
7+
/**
8+
* class FlagParseException
9+
*/
10+
class FlagParseException extends FlagException
11+
{
12+
/**
13+
* @var string
14+
*/
15+
public $flagType = 'option';
16+
17+
public function __construct(string $message, int $code = 0, string $flagType = 'option')
18+
{
19+
$this->flagType = $flagType;
20+
21+
parent::__construct($message, $code);
22+
}
23+
}

src/Flags.php

Lines changed: 17 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,18 @@
1010
namespace Toolkit\PFlag;
1111

1212
use RuntimeException;
13-
use Toolkit\Cli\Cli;
1413
use Toolkit\PFlag\Exception\FlagException;
14+
use Toolkit\PFlag\Exception\FlagParseException;
1515
use Toolkit\PFlag\Flag\Argument;
1616
use Toolkit\PFlag\Flag\Option;
1717
use Toolkit\Stdlib\Str;
1818
use function array_shift;
19-
use function array_slice;
2019
use function count;
20+
use function implode;
2121
use function is_array;
2222
use function is_string;
2323
use function ltrim;
24+
use function sprintf;
2425
use function str_split;
2526
use function strlen;
2627
use function substr;
@@ -76,20 +77,6 @@ class Flags extends AbstractFlags
7677
*/
7778
private $arguments = [];
7879

79-
/**
80-
* Has array argument
81-
*
82-
* @var bool
83-
*/
84-
private $arrayArg = false;
85-
86-
/**
87-
* Has optional argument
88-
*
89-
* @var bool
90-
*/
91-
private $optionalArg = false;
92-
9380
/**
9481
* @return self
9582
*/
@@ -132,21 +119,11 @@ public function doParse(array $flags): bool
132119
break;
133120
}
134121

135-
// echo error and display help
136-
if (self::STATUS_ERR === $status) {
137-
Cli::colored('ERROR: TODO flag error', 'error');
138-
$this->displayHelp();
139-
break;
140-
}
141-
142122
// display help
143123
if (self::STATUS_HELP === $status) {
144124
$this->displayHelp();
145125
break;
146126
}
147-
148-
// $status = self::STATUS_ARG is arg, collect value.
149-
// $this->rawArgs[] = array_shift($this->flags);
150127
}
151128

152129
// revert flags.
@@ -256,7 +233,7 @@ protected function parseOneOption(): array
256233
return [true, self::STATUS_OK];
257234
}
258235

259-
throw new FlagException("flag option provided but not defined: $val", 404);
236+
throw new FlagParseException("flag option provided but not defined: $val", 404);
260237
}
261238

262239
$opt = $this->options[$rName];
@@ -283,7 +260,7 @@ protected function parseOneOption(): array
283260
}
284261

285262
if (!$hasVal) {
286-
throw new FlagException("flag option '$val' needs an value", 400);
263+
throw new FlagParseException("flag option '$val' needs an value", 400);
287264
}
288265

289266
// set value
@@ -416,17 +393,21 @@ public function bindingArguments(): self
416393
}
417394

418395
if ($arg->isArray()) {
419-
// remain args
420-
$values = array_slice($args, $index);
421-
422-
foreach ($values as $value) {
396+
// collect remain args
397+
foreach ($args as $value) {
423398
$arg->setValue($value);
424399
}
400+
$args = [];
425401
} else {
426402
$arg->setValue($args[$index]);
403+
unset($args[$index]);
427404
}
428405
}
429406

407+
if ($this->strictCheckArgs && $args) {
408+
throw new FlagException(sprintf('unknown arguments (error: "%s").', implode(', ', $args)));
409+
}
410+
430411
return $this;
431412
}
432413

@@ -490,9 +471,10 @@ public function setArgRules(array $argRules): void
490471
*
491472
* @param string $name
492473
* @param string|array $rule
493-
* @see argRules for an rule
494474
*
495475
* @return self
476+
* @see argRules for an rule
477+
*
496478
*/
497479
public function addArgByRule(string $name, $rule): AbstractFlags
498480
{
@@ -632,22 +614,6 @@ public function getArguments(): array
632614
return $this->arguments;
633615
}
634616

635-
/**
636-
* @return bool
637-
*/
638-
public function hasOptionalArg(): bool
639-
{
640-
return $this->optionalArg;
641-
}
642-
643-
/**
644-
* @return bool
645-
*/
646-
public function hasArrayArg(): bool
647-
{
648-
return $this->arrayArg;
649-
}
650-
651617
protected function resetArguments(): void
652618
{
653619
$this->name2index = [];
@@ -697,9 +663,10 @@ public function setOptRules(array $optRules): void
697663
*
698664
* @param string $name
699665
* @param string|array $rule
700-
* @see optRules for rule
701666
*
702667
* @return self
668+
* @see optRules for rule
669+
*
703670
*/
704671
public function addOptByRule(string $name, $rule): AbstractFlags
705672
{

0 commit comments

Comments
 (0)