Command   A
last analyzed

Complexity

Total Complexity 12

Size/Duplication

Total Lines 105
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 12
eloc 29
dl 0
loc 105
rs 10
c 1
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 2
A addParams() 0 9 3
A setLocale() 0 5 1
A getParams() 0 8 2
A execute() 0 10 2
A addAliase() 0 8 2
1
<?php
2
3
namespace ConsoleArgs;
4
5
/**
6
 * Объект команд
7
 * Отвечает за выполнение команд и работу с параметрами
8
 */
9
class Command
10
{
11
    public $name;
12
    public $callable;
13
    public $params  = [];
14
    public $aliases = [];
15
16
    protected $locale;
17
18
    /**
19
     * Конструктор
20
     * 
21
     * @param string $name - имя команды
22
     * [@param \Closure $callable = null] - анонимная функция для выполнения
23
     */
24
    public function __construct (string $name, \Closure $callable = null)
25
    {
26
        $this->name   = $name;
27
        $this->locale = new Locale;
28
29
        if ($callable !== null)
30
            $this->callable = $callable;
31
    }
32
33
    /**
34
     * Установка локализации
35
     * 
36
     * @param Locale $locale - объект локализации
37
     * 
38
     * @return Command - возвращает сам себя
39
     */
40
    public function setLocale (Locale $locale): Command
41
    {
42
        $this->locale = $locale;
43
44
        return $this;
45
    }
46
47
    /**
48
     * Установка параметров
49
     * 
50
     * @param array $params - список параметров для установки
51
     * 
52
     * @return Command - возвращает сам себя
53
     */
54
    public function addParams (array $params): Command
55
    {
56
        foreach ($params as $param)
57
            if ($param instanceof Parameter)
58
                $this->params[current ($param->names)] = $param;
0 ignored issues
show
Bug introduced by
Accessing names on the interface ConsoleArgs\Parameter suggest that you code against a concrete implementation. How about adding an instanceof check?
Loading history...
59
60
            else throw new \Exception ($this->locale->param_type_exception);
61
62
        return $this;
63
    }
64
65
    /**
66
     * Добавление алиаса
67
     * 
68
     * @param string $name - алиас для добавления
69
     * 
70
     * @return Command - возвращает сам себя
71
     */
72
    public function addAliase (string $name)
73
    {
74
        if (array_search ($name, $this->aliases) !== false)
75
            throw new \Exception ($this->locale->aliase_exists_exception);
76
77
        $this->aliases[] = $name;
78
79
        return $this;
80
    }
81
82
    /**
83
     * Парсинг параметров
84
     * 
85
     * @param array &$args - аргументы для парсинга
86
     * 
87
     * @return array - возвращает ассоциативный массив [параметр] => [значение]
88
     */
89
    public function getParams (array &$args): array
90
    {
91
        $params = array_combine (array_keys ($this->params), array_fill (0, sizeof ($this->params), null));
92
93
        foreach ($this->params as $name => $param)
94
            $params[$name] = $param->parse ($args);
95
96
        return $params;
97
    }
98
99
    /**
100
     * Выполнение команды
101
     * 
102
     * @param array &$args - аргументы команды
103
     */
104
    public function execute (array &$args)
105
    {
106
        if ($this->callable instanceof \Closure)
107
        {
108
            $params = $this->getParams ($args);
109
110
            return $this->callable->call ($this, array_values ($args), $params);
111
        }
112
113
        throw new \Exception ($this->locale->execution_error);
114
    }
115
}
116