Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
dg committed Dec 12, 2022
1 parent 146f8ea commit a8ccba0
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 0 deletions.
12 changes: 12 additions & 0 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,15 @@ composer require nette/command-line
It requires PHP version 8.0 and supports PHP up to 8.2.

If you like Nette, **[please make a donation now](https://nette.org/donate)**. Thank you!


-o Short option
--long Long option
-o | --long Combined short & long
-o value With argument
-o <value> With argument (alternative syntax)
-o=value With argument (alternative syntax)
-o value With default value (default: php)
-o value... Repeatable option
-o <alt1|alt2> Enumerated required value
-o [alt1|alt2] Enumerated optional value
85 changes: 85 additions & 0 deletions src/CommandLine/Parser.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,23 @@ class Parser
private string $help;


/*
Options:
-p Short option
--long Long option
-p | --long Combined short & long
-p With default value (default: php)
-p=<info>
-p <info>
-p info
-p info...
-p <option1|option2> Repeatable
-p [option1|option2] Enum
*/


public function __construct(string $help, array $defaults = [])
{
$this->help = $help;
Expand Down Expand Up @@ -89,6 +106,73 @@ public function __construct(string $help, array $defaults = [])
}


public function addArgument(string $name, array $options): static
{
$this->positional[] = $name;
$this->options[$name] = [
self::Argument => null,
self::Optional => $options[self::Optional] ?? null,
self::Repeatable => $options[self::Repeatable] ?? null,
self::Enum => null,
self::Default => $options[self::Default] ?? null,
];
}


/**
* @param string|string[] $name
*/
public function addOption($name): static
{
$this->options[$name] = [
self::Argument => false,
self::Optional => false, // ?
self::Repeatable => false,
self::Enum => null,
self::Default => null,
];
}


/**
* @param string|string[] $name
*/
public function addValueOption($name, array $options): static
{
foreach ((array) $name as $name) {
$this->options[$name] = [
self::Argument => true,
self::Optional => false, // ?
self::Repeatable => false,
self::Enum => null,
self::Default => null,
];
}
}


/**
* @param string|string[] $name
*/
public function addEnumeratedOption($name, array $elements, array $options): static
{
foreach ((array) $name as $name) {
$this->options[$name] = [
self::Argument => true,
self::Optional => false, // ?
self::Repeatable => false,
self::Enum => null,
self::Default => null,
];
}
}


public static function fromHelp(string $help): static
{
}


public function parse(?array $args = null): array
{
if ($args === null) {
Expand Down Expand Up @@ -181,6 +265,7 @@ public function parse(?array $args = null): array

public function help(): void
{
// TODO: generate help?
echo $this->help;
}

Expand Down
2 changes: 2 additions & 0 deletions tests/Parser.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,8 @@ test('positional arguments', function () {
$cmd = new Parser('', [
'pos' => [Parser::Default => 'default', Parser::Repeatable => true],
]);

dump($cmd);
Assert::same(['pos' => ['default']], $cmd->parse([]));
});

Expand Down

0 comments on commit a8ccba0

Please sign in to comment.