Completed
Push — master ( 90ac5a...649bdf )
by Amine
11s
created

HelpCommand::execute()   B

Complexity

Conditions 5
Paths 6

Size

Total Lines 24
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 24
rs 8.5125
c 0
b 0
f 0
cc 5
eloc 16
nc 6
nop 0
1
<?php namespace Tarsana\Command\Commands;
2
3
use Tarsana\Command\SubCommand;
4
use Tarsana\Syntax\ArraySyntax;
5
use Tarsana\Syntax\ObjectSyntax;
6
use Tarsana\Syntax\OptionalSyntax;
7
use Tarsana\Syntax\Syntax;
8
9
class HelpCommand extends SubCommand {
10
11
    protected function execute()
12
    {
13
        $c = $this->console();
14
        $c->line("<info>{$this->parent()->name()}</info> version <info>{$this->parent()->version()}</info>");
15
        $c->line("<br>{$this->parent()->description()}<br>");
16
17
        $syntax = $this->parent()->syntax();
18
        if ($syntax) {
19
            $c->line("Syntax: <success>[options] " . $this->formatSyntax($syntax) . "</success>");
20
            $c->line("Arguments:");
21
            foreach ($syntax->fields() as $name => $s) {
22
                $this->printField($name, $s);
23
            }
24
        }
25
26
        $options = array_keys($this->parent()->options());
27
        if (!empty($options)) {
28
            $c->line("Options:");
29
            foreach ($options as $name) {
30
                $description = $this->parent()->describe($name);
31
                $c->line("<tab><warn>{$name}</warn> {$description}");
32
            }
33
        }
34
    }
35
36
    protected function formatSyntax(Syntax $s) : string
37
    {
38
        if ($s instanceof ObjectSyntax)
39
            return implode($s->separator(), array_keys($s->fields()));
40
        if ($s instanceof ArraySyntax)
41
            return $this->formatSyntax($s->syntax()) . $s->separator() . '...';
42
        if ($s instanceof OptionalSyntax)
43
            return $this->formatSyntax($s->syntax());
44
45
        return (string) $s;
46
    }
47
48
    protected function getFields(Syntax $s) : array
49
    {
50
        if ($s instanceof ObjectSyntax)
51
            return $s->fields();
52
        if ($s instanceof ArraySyntax || $s instanceof OptionalSyntax)
53
            return $this->getFields($s->syntax());
54
        return [];
55
    }
56
57
    protected function printField(string $name, Syntax $s, string $prefix = '', int $level = 1)
58
    {
59
        $tabs = str_repeat('<tab>', $level);
60
        $optional = ($s instanceof OptionalSyntax);
61
        if ($optional)
62
            $default = 'default: ' . json_encode($s->getDefault());
63
        else
64
            $default = 'required';
65
        $description = $this->parent()->describe($prefix.$name);
66
        $syntax = $this->formatSyntax($s);
67
        $this->console()->line("{$tabs}<warn>{$name}</warn> <success>{$syntax}</success> {$description} <info>({$default})</info>");
68
69
        $level ++;
70
        $prefix .= $name . '.';
71
        foreach ($this->getFields($s) as $field => $syntax) {
72
            $this->printField($field, $syntax, $prefix, $level);
73
        }
74
    }
75
76
}
77