Completed
Push — master ( b13ea3...fb1b03 )
by Dave
18s queued 15s
created

ArrayUtils::assertArrayOfStrings()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 3
nc 3
nop 1
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Static Analysis Results Baseliner (sarb).
5
 *
6
 * (c) Dave Liddament
7
 *
8
 * For the full copyright and licence information please view the LICENSE file distributed with this source code.
9
 */
10
11
declare(strict_types=1);
12
13
namespace DaveLiddament\StaticAnalysisResultsBaseliner\Domain\Utils;
14
15
class ArrayUtils
16
{
17
    /**
18
     * Gets string value for given key in the array.
19
     *
20
     * @throws ArrayParseException
21
     *
22
     * @psalm-param array<mixed> $array
23
     */
24
    public static function getStringValue(array $array, string $key): string
25
    {
26
        self::assertArrayKeyExists($array, $key);
27
        if (is_string($array[$key])) {
28
            return $array[$key];
29
        }
30
        throw ArrayParseException::invalidType($key, 'string');
31
    }
32
33
    /**
34
     * Gets int value for given key in the array.
35
     *
36
     * @throws ArrayParseException
37
     *
38
     * @psalm-param array<mixed> $array
39
     */
40
    public static function getIntValue(array $array, string $key): int
41
    {
42
        self::assertArrayKeyExists($array, $key);
43
        if (is_int($array[$key])) {
44
            return $array[$key];
45
        }
46
        throw ArrayParseException::invalidType($key, 'int');
47
    }
48
49
    /**
50
     * Gets int value for given key in the array.
51
     *
52
     * @throws ArrayParseException
53
     *
54
     * @psalm-param array<mixed> $array
55
     */
56
    public static function getIntOrNullValue(array $array, string $key): ?int
57
    {
58
        self::assertArrayKeyExists($array, $key);
59
        if (null === $array[$key]) {
60
            return null;
61
        }
62
        if (is_int($array[$key])) {
63
            return $array[$key];
64
        }
65
        throw ArrayParseException::invalidType($key, 'int');
66
    }
67
68
    /**
69
     * Gets optional value. Note: if key exists, then the value must be a string.
70
     *
71
     * @throws ArrayParseException
72
     *
73
     * @psalm-param array<mixed> $array
74
     */
75
    public static function getOptionalStringValue(array $array, string $key): ?string
76
    {
77
        if (!array_key_exists($key, $array)) {
78
            return null;
79
        }
80
81
        if (is_string($array[$key])) {
82
            return $array[$key];
83
        }
84
        throw ArrayParseException::invalidType($key, 'string');
85
    }
86
87
    /**
88
     * Gets array value for given key in the array.
89
     *
90
     * @throws ArrayParseException
91
     *
92
     * @psalm-param array<mixed> $array
93
     *
94
     * @psalm-return array<mixed> $array
95
     */
96
    public static function getArrayValue(array $array, string $key): array
97
    {
98
        self::assertArrayKeyExists($array, $key);
99
        if (is_array($array[$key])) {
100
            return $array[$key];
101
        }
102
        throw ArrayParseException::invalidType($key, 'array');
103
    }
104
105
    /**
106
     * @throws ArrayParseException
107
     *
108
     * @psalm-param array<mixed> $array
109
     */
110
    private static function assertArrayKeyExists(array $array, string $key): void
111
    {
112
        if (!array_key_exists($key, $array)) {
113
            throw ArrayParseException::missingKey($key);
114
        }
115
    }
116
117
    /**
118
     * @psalm-assert array $entity
119
     *
120
     * @throws ArrayParseException
121
     */
122
    public static function assertArray(mixed $entity): void
123
    {
124
        if (!is_array($entity)) {
125
            throw ArrayParseException::invalidType('base level', 'array');
126
        }
127
    }
128
129
    /**
130
     * @psalm-assert array<array-key,string> $array
131
     *
132
     * @param array<mixed> $array
133
     *
134
     * @throws ArrayParseException
135
     */
136
    public static function assertArrayOfStrings(array $array): void
137
    {
138
        foreach ($array as $key => $value) {
139
            if (!is_string($value)) {
140
                throw ArrayParseException::invalidType((string) $key, 'string');
141
            }
142
        }
143
    }
144
145
    /**
146
     * Extracts a integer value from an array, however the integer is in string format.
147
     *
148
     * e.g. Assume the following code:
149
     *
150
     *   $array = ['age' => '21'];
151
     *   $age = ArrayUtils::getIntAsStringValue($array, 'age');
152
     *
153
     * $age would be the integer value 21.
154
     *
155
     * @psalm-param array<mixed> $array
156
     *
157
     * @throws ArrayParseException
158
     */
159
    public static function getIntAsStringValue(array $array, string $key): int
160
    {
161
        self::assertArrayKeyExists($array, $key);
162
        if (is_string($array[$key])) {
163
            $valueAsString = $array[$key];
164
            $valueAsInt = (int) $valueAsString;
165
            $intValueAsString = (string) $valueAsInt;
166
            if ($intValueAsString === $valueAsString) {
167
                return $valueAsInt;
168
            }
169
        }
170
        throw ArrayParseException::invalidType($key, 'int as string');
171
    }
172
}
173