Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
26 / 26
100.00% covered (success)
100.00%
3 / 3
CRAP
100.00% covered (success)
100.00%
1 / 1
CliCommands
100.00% covered (success)
100.00%
26 / 26
100.00% covered (success)
100.00%
3 / 3
12
100.00% covered (success)
100.00%
1 / 1
 add
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 current
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 matchCurrent
100.00% covered (success)
100.00%
24 / 24
100.00% covered (success)
100.00%
1 / 1
10
1<?php
2
3namespace Dynart\Micro;
4
5class CliCommands {
6
7    protected array $commands = [];
8
9    public function add(string $name, $callable, array $paramNames = [], array $flagNames = []): void {
10        $this->commands[$name] = [$callable, $paramNames, $flagNames];
11    }
12
13    public function current() {
14        return $_SERVER['argv'][1] ?? null;
15    }
16
17    public function matchCurrent(): ?array {
18        if (!isset($this->commands[$this->current()])) {
19            return null;
20        }
21        list($callable, $paramNames, $flagNames) = $this->commands[$this->current()];
22
23        // reset parameters
24        $params = [];
25        foreach ($paramNames as $name) {
26            $params[$name] = '';
27        }
28        foreach ($flagNames as $name) {
29            $params[$name] = false;
30        }
31
32        // get parameters
33        $currentName = '';
34        $currentIndex = 0;
35        for ($i = 2; $i < $_SERVER['argc']; $i++) {
36            $argument = $_SERVER['argv'][$i];
37            if ($argument[0] == '-' && !$currentName) {
38                $name = substr($argument, 1);
39                if (in_array($name, $paramNames)) {
40                    $currentName = $name;
41                } else if (in_array($name, $flagNames)) {
42                    $params[$name] = true;
43                }
44            } else if ($currentName) {
45                $params[$currentName] = $argument;
46                $currentName = '';
47            } else {
48                $params[$currentIndex] = $argument;
49                $currentIndex++;
50            }
51        }
52
53        return [$callable, $params];
54    }
55
56}