Passed
Push — master ( 89df4c...863b29 )
by Milroy
12:00
created

QueryParamBag   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 97
Duplicated Lines 0 %

Test Coverage

Coverage 88.64%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 32
c 1
b 0
f 0
dl 0
loc 97
ccs 39
cts 44
cp 0.8864
rs 10
wmc 18

13 Methods

Rating   Name   Duplication   Size   Complexity  
A prepareStringBasedParams() 0 7 1
A has() 0 3 1
A prepareStringBasedNestedParams() 0 7 1
A each() 0 3 1
A getParams() 0 3 1
A prepareParams() 0 6 3
A isEmpty() 0 3 1
A keys() 0 3 1
A prepareArrayBasedParams() 0 12 3
A prepareArrayBasedNestedParams() 0 5 1
A get() 0 3 1
A __construct() 0 4 2
A filled() 0 3 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace ApiChef\RequestQueryHelper;
6
7
use Illuminate\Support\Arr;
8
9
class QueryParamBag
10
{
11
    private array $params = [];
12
13
    /**
14
     * @param null|string|array $field
15
     */
16
    public function __construct($field = null)
17
    {
18
        if ($field !== null) {
19
            $this->prepareParams($field);
20 9
        }
21
    }
22 9
23 9
    public function filled(): bool
24
    {
25 9
        return ! empty($this->params);
26 9
    }
27
28 9
    public function has($field): bool
29
    {
30 3
        return Arr::has($this->params, $field);
31
    }
32 3
33
    public function keys(): array
34
    {
35 6
        return array_keys($this->params);
36
    }
37 6
38
    public function get($field, $default = null)
39
    {
40
        return Arr::get($this->params, $field, $default);
41
    }
42
43
    public function isEmpty($field): bool
44
    {
45 6
        return empty($this->get($field));
46
    }
47 6
48
    public function each($callback): void
49
    {
50 6
        collect($this->params)->each($callback);
51
    }
52 6
53
    private function prepareParams($value): void
54
    {
55
        if (is_string($value)) {
56
            $this->prepareStringBasedParams($value);
57
        } elseif (is_array($value)) {
58
            $this->prepareArrayBasedParams($value);
59
        }
60 9
    }
61
62 9
    private function prepareStringBasedParams($value): void
63 3
    {
64 6
        collect(explode(',', $value))->each(function ($param) {
65 6
            $sections = explode(':', $param);
66
            $params = $this->prepareStringBasedNestedParams(array_slice($sections, 1));
67 9
68
            $this->params[$sections[0]] = $params;
69 3
        });
70
    }
71
72 3
    private function prepareStringBasedNestedParams(array $params): array
73 3
    {
74
        return collect($params)->mapWithKeys(function ($param) {
75 3
            $paramSections = explode('(', $param);
76 3
77 3
            return [$paramSections[0] => explode('|', str_replace(')', '', $paramSections[1]))];
78
        })->all();
79 3
    }
80
81
    private function prepareArrayBasedParams($value): void
82 3
    {
83
        collect($value)->each(function ($params, $field) {
84 3
            if (empty($params)) {
85 3
                $params = [];
86
            }
87
88 6
            if (is_array($params)) {
89
                $params = $this->prepareArrayBasedNestedParams($params);
90
            }
91 6
92 3
            $this->params[$field] = $params;
93
        });
94
    }
95 6
96 3
    private function prepareArrayBasedNestedParams(array $params): array
97
    {
98
        return collect($params)->mapWithKeys(function ($param, $name) {
99 6
            return [$name => explode('|', $param)];
100 6
        })->all();
101 6
    }
102
103 3
    public function getParams(): array
104
    {
105
        return $this->params;
106 3
    }
107
}
108