Opts::all()   A
last analyzed

Complexity

Conditions 4
Paths 4

Size

Total Lines 17
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 4

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
eloc 8
nc 4
nop 2
dl 0
loc 17
ccs 9
cts 9
cp 1
crap 4
rs 10
c 1
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Conia\Cli;
6
7
use ValueError;
8
9
/**
10
 * PHP's native `getopt` stops after the first "non-option" argument
11
 * which in our case is the command in `php run <command>`.
12
 *
13
 * `-arg`, `--arg` and even `---arg` are treated equally.
14
 */
15
class Opts
16
{
17
    protected readonly array $opts;
18
19 7
    public function __construct()
20
    {
21 7
        $this->opts = $this->getOpts();
0 ignored issues
show
Bug introduced by
The property opts is declared read-only in Conia\Cli\Opts.
Loading history...
22
    }
23
24 3
    public function has(string $key): bool
25
    {
26 3
        return isset($this->opts[$key]);
27
    }
28
29 3
    public function get(string $key, string $default = ''): string
30
    {
31 3
        if (func_num_args() === 1) {
32 3
            $this->validate($key);
33
34 1
            return $this->opts[$key]->get();
35
        }
36
37 1
        if (!$this->has($key)) {
38 1
            return $default;
39
        }
40
41 1
        if ($this->opts[$key]->isset()) {
42 1
            return $this->opts[$key]->get();
43
        }
44
45 1
        return $default;
46
    }
47
48 3
    public function all(string $key, array $default = []): array
49
    {
50 3
        if (func_num_args() === 1) {
51 3
            $this->validate($key);
52
53 1
            return $this->opts[$key]->all();
54
        }
55
56 1
        if (!$this->has($key)) {
57 1
            return $default;
58
        }
59
60 1
        if ($this->opts[$key]->isset()) {
61 1
            return $this->opts[$key]->all();
62
        }
63
64 1
        return $default;
65
    }
66
67 7
    protected static function getOpts(): array
68
    {
69 7
        $opts = [];
70 7
        $key = null;
71
72 7
        foreach ($_SERVER['argv'] ?? [] as $arg) {
73 7
            if (str_starts_with($arg, '-')) {
74 7
                $key = $arg;
75
76 7
                if (!isset($opts[$key])) {
77 7
                    $opts[$key] = new Opt();
78
                }
79
            } else {
80 7
                if ($key) {
81 7
                    $opts[$key]->set($arg);
82
                }
83
            }
84
        }
85
86 7
        return $opts;
87
    }
88
89 6
    protected function validate(string $key): void
90
    {
91 6
        if (!isset($this->opts[$key])) {
92 2
            throw new ValueError("Unknown option: {$key}");
93
        }
94
95 4
        if (isset($this->opts[$key]) && !$this->opts[$key]->isset()) {
96 2
            throw new ValueError("No value given for {$key}");
97
        }
98
    }
99
}
100