Skip to content

Commit f085b16

Browse files
committed
feat: support add CmdHandler class to CliApp
1 parent 9bf54ac commit f085b16

File tree

10 files changed

+128
-14
lines changed

10 files changed

+128
-14
lines changed

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ Create an multi commands application, run subcommand. see example file [example/
292292
use Toolkit\Cli\Cli;
293293
use Toolkit\PFlag\CliApp;
294294
use Toolkit\PFlag\FlagsParser;
295+
use Toolkit\PFlagTest\Cases\DemoCmdHandler;
295296

296297
$app = new CliApp();
297298

@@ -322,6 +323,8 @@ $app->add('test2', function (FlagsParser $fs) {
322323
// fn - required php 7.4+
323324
$app->add('show-err', fn() => throw new RuntimeException('test show exception'));
324325

326+
$app->addHandler(DemoCmdHandler::class);
327+
325328
$app->run();
326329
```
327330

example/cliapp.php

+3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
use Toolkit\Cli\Cli;
44
use Toolkit\PFlag\CliApp;
55
use Toolkit\PFlag\FlagsParser;
6+
use Toolkit\PFlagTest\Cases\DemoCmdHandler;
67

78
require dirname(__DIR__) . '/test/bootstrap.php';
89

@@ -37,5 +38,7 @@
3738

3839
$app->add('show-err', fn() => throw new RuntimeException('test show exception'));
3940

41+
$app->addHandler(DemoCmdHandler::class);
42+
4043
$app->run();
4144

src/CliApp.php

+28-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
use Throwable;
99
use Toolkit\Cli\Cli;
1010
use Toolkit\Cli\Color;
11+
use Toolkit\PFlag\Contract\CmdHandlerInterface;
1112
use Toolkit\Stdlib\Arr;
13+
use Toolkit\Stdlib\Helper\Assert;
14+
use Toolkit\Stdlib\Helper\Valid;
1215
use Toolkit\Stdlib\Obj\Traits\AutoConfigTrait;
1316
use function array_merge;
1417
use function array_shift;
@@ -61,12 +64,14 @@ class CliApp
6164
/**
6265
* @var FlagsParser
6366
*/
64-
protected FlagsParser|SFlags $flags;
67+
protected FlagsParser $flags;
6568

6669
/**
70+
* Flags for current run command
71+
*
6772
* @var FlagsParser|null
6873
*/
69-
protected ?FlagsParser $cmdFlags;
74+
protected ?FlagsParser $cmdFlags = null;
7075

7176
/**
7277
* @var string
@@ -358,6 +363,27 @@ public function add(string $command, callable $handler, array $config = []): voi
358363
$this->addCommand($command, $handler, $config);
359364
}
360365

366+
/**
367+
* @param class-string|CmdHandlerInterface $handler
368+
*/
369+
public function addHandler(string|CmdHandlerInterface $handler): void
370+
{
371+
if (is_string($handler)) {
372+
// class string.
373+
if (class_exists($handler)) {
374+
$handler = new $handler;
375+
Assert::isTrue($handler instanceof CmdHandlerInterface, 'must be an class and instance of CmdHandlerInterface');
376+
} else {
377+
throw new InvalidArgumentException('must be an class string');
378+
}
379+
}
380+
381+
$config = $handler->metadata();
382+
$command = Valid::arrayHasNoEmptyKey($config, 'name');
383+
384+
$this->addCommand($command, $handler, $config);
385+
}
386+
361387
/**
362388
* @param string $command
363389
* @param callable|object|class-string $handler

src/CliCmd.php

+2-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
namespace Toolkit\PFlag;
44

5-
use InvalidArgumentException;
65
use RuntimeException;
76
use Throwable;
87
use Toolkit\Stdlib\Obj\Traits\AutoConfigTrait;
@@ -27,7 +26,7 @@ class CliCmd
2726
/**
2827
* @var FlagsParser
2928
*/
30-
private FlagsParser|SFlags $flags;
29+
private FlagsParser $flags;
3130

3231
/**
3332
* @var callable(FlagsParser): mixed
@@ -102,7 +101,7 @@ protected function prepare(FlagsParser $fs): void
102101
}
103102

104103
/**
105-
* @return int|mixed
104+
* @return mixed
106105
*/
107106
public function run(): mixed
108107
{

src/Contract/CmdHandlerInterface.php

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace Toolkit\PFlag\Contract;
4+
5+
use Toolkit\PFlag\CliApp;
6+
use Toolkit\PFlag\FlagsParser;
7+
8+
/**
9+
* interface CmdHandlerInterface
10+
*
11+
* @author inhere
12+
*/
13+
interface CmdHandlerInterface
14+
{
15+
/**
16+
* @return array{name:string, desc: string, example:string, help: string}
17+
*/
18+
public function metadata(): array;
19+
20+
/**
21+
* @param FlagsParser $fs
22+
*
23+
* @return void
24+
*/
25+
public function configure(FlagsParser $fs): void;
26+
27+
/**
28+
* @param FlagsParser $fs
29+
* @param CliApp $app
30+
*
31+
* @return mixed
32+
*/
33+
public function execute(FlagsParser $fs, CliApp $app): mixed;
34+
}

test/Cases/DemoCmdHandler.php

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace Toolkit\PFlagTest\Cases;
4+
5+
use Toolkit\PFlag\CliApp;
6+
use Toolkit\PFlag\Contract\CmdHandlerInterface;
7+
use Toolkit\PFlag\FlagsParser;
8+
use function vdump;
9+
10+
/**
11+
* class DemoCmdHandler
12+
*
13+
* @author inhere
14+
*/
15+
class DemoCmdHandler implements CmdHandlerInterface
16+
{
17+
/**
18+
* @return array{name:string, desc: string, example:string, help: string}
19+
*/
20+
public function metadata(): array
21+
{
22+
return [
23+
'name' => 'demo',
24+
'desc' => 'desc for demo command handler',
25+
];
26+
}
27+
28+
/**
29+
* @param FlagsParser $fs
30+
*
31+
* @return void
32+
*/
33+
public function configure(FlagsParser $fs): void
34+
{
35+
$fs->addOptsByRules([
36+
'opt1' => 'string;a string opt1 for command test2, and is required;true',
37+
'opt2' => 'int;a int opt2 for command test2',
38+
]);
39+
}
40+
41+
/**
42+
* @param FlagsParser $fs
43+
* @param CliApp $app
44+
*
45+
* @return mixed
46+
*/
47+
public function execute(FlagsParser $fs, CliApp $app): mixed
48+
{
49+
vdump(__METHOD__);
50+
}
51+
}

test/RuleParser.php test/Cases/RuleParser.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?php declare(strict_types=1);
22

3-
namespace Toolkit\PFlagTest;
3+
namespace Toolkit\PFlagTest\Cases;
44

55
use Toolkit\PFlag\Concern\RuleParserTrait;
66

test/CliAppTest.php

+5-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Toolkit\PFlagTest;
44

55
use Toolkit\PFlag\CliApp;
6+
use Toolkit\PFlagTest\Cases\DemoCmdHandler;
67
use Toolkit\Stdlib\Obj\DataObject;
78

89
/**
@@ -17,10 +18,7 @@ private function initApp(CliApp $app): DataObject
1718
$buf = DataObject::new();
1819

1920
// php 7.4+
20-
// $app->add('test1', fn() => $buf->set('key', 'in test1'));
21-
$app->add('test1', function () use ($buf) {
22-
$buf->set('key', 'in test1');
23-
});
21+
$app->add('test1', fn() => $buf->set('key', 'in test1'));
2422

2523
$app->addCommands([
2624
'test2' => [
@@ -35,6 +33,8 @@ private function initApp(CliApp $app): DataObject
3533
],
3634
]);
3735

36+
$app->addHandler(DemoCmdHandler::class);
37+
3838
return $buf;
3939
}
4040

@@ -52,6 +52,7 @@ public function testCliApp_basic(): void
5252

5353
$this->assertTrue($app->hasCommand('test1'));
5454
$this->assertTrue($app->hasCommand('test2'));
55+
$this->assertTrue($app->hasCommand('demo'));
5556

5657
$app->runByArgs(['test1']);
5758
$this->assertEquals('in test1', $buf->get('key'));

test/Concern/RuleParserTest.php

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@
33
namespace Toolkit\PFlagTest\Concern;
44

55
use Toolkit\PFlagTest\BaseFlagsTestCase;
6-
use Toolkit\PFlagTest\RuleParser;
7-
use function vdump;
6+
use Toolkit\PFlagTest\Cases\RuleParser;
87

98
/**
109
* class RuleParserTest

test/FlagsTest.php

-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
use Toolkit\PFlag\Flags;
1414
use Toolkit\PFlag\Flag\Option;
1515
use Toolkit\PFlag\FlagType;
16-
use function edump;
17-
use function vdump;
1816

1917
/**
2018
* Class FlagsTest

0 commit comments

Comments
 (0)