Completed
Push — master ( cbe94a...9757e4 )
by Amine
01:43
created

HelpCommand::execute()   C

Complexity

Conditions 7
Paths 12

Size

Total Lines 32
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 32
rs 6.7272
c 0
b 0
f 0
cc 7
eloc 21
nc 12
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 init()
12
    {
13
        $this->name('Help')
14
             ->description('Shows the help message');
15
    }
16
17
    protected function execute()
18
    {
19
        $c = $this->console();
20
        $c->line("<info>{$this->parent()->name()}</info> version <info>{$this->parent()->version()}</info>");
21
        $c->line("<br>{$this->parent()->description()}<br>");
22
23
        $syntax = $this->parent()->syntax();
24
        if ($syntax) {
25
            $c->line("Syntax: <success>[options] " . $this->formatSyntax($syntax) . "</success>");
26
            $c->line("Arguments:");
27
            foreach ($syntax->fields() as $name => $s) {
28
                $this->printField($name, $s);
29
            }
30
        }
31
32
        $options = array_keys($this->parent()->options());
33
        if (!empty($options)) {
34
            $c->line("Options:");
35
            foreach ($options as $name) {
36
                $description = $this->parent()->describe($name);
37
                $c->line("<tab><warn>{$name}</warn> {$description}");
38
            }
39
        }
40
41
        $subCommands = $this->parent()->commands();
42
        if (!empty($subCommands)) {
43
            $c->line("SubCommands:");
44
            foreach ($subCommands as $name => $cmd) {
45
                $c->line("<tab><warn>{$name}</warn> {$cmd->description()}");
46
            }
47
        }
48
    }
49
50
    protected function formatSyntax(Syntax $s) : string
51
    {
52
        if ($s instanceof ObjectSyntax)
53
            return implode($s->separator(), array_keys($s->fields()));
54
        if ($s instanceof ArraySyntax)
55
            return $this->formatSyntax($s->syntax()) . $s->separator() . '...';
56
        if ($s instanceof OptionalSyntax)
57
            return $this->formatSyntax($s->syntax());
58
59
        return (string) $s;
60
    }
61
62
    protected function getFields(Syntax $s) : array
63
    {
64
        if ($s instanceof ObjectSyntax)
65
            return $s->fields();
66
        if ($s instanceof ArraySyntax || $s instanceof OptionalSyntax)
67
            return $this->getFields($s->syntax());
68
        return [];
69
    }
70
71
    protected function printField(string $name, Syntax $s, string $prefix = '', int $level = 1)
72
    {
73
        $tabs = str_repeat('<tab>', $level);
74
        $optional = ($s instanceof OptionalSyntax);
75
        if ($optional)
76
            $default = 'default: ' . json_encode($s->getDefault());
77
        else
78
            $default = 'required';
79
        $description = $this->parent()->describe($prefix.$name);
80
        $syntax = $this->formatSyntax($s);
81
        $this->console()->line("{$tabs}<warn>{$name}</warn> <success>{$syntax}</success> {$description} <info>({$default})</info>");
82
83
        $level ++;
84
        $prefix .= $name . '.';
85
        foreach ($this->getFields($s) as $field => $syntax) {
86
            $this->printField($field, $syntax, $prefix, $level);
87
        }
88
    }
89
90
}
91