Passed
Push — master ( 97e9e9...d7ed45 )
by Sylvain
13:49
created

CountryCode2Type   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 233
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 9
eloc 196
c 1
b 0
f 0
dl 0
loc 233
ccs 16
cts 16
cp 1
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A parseValue() 0 8 2
A serialize() 0 8 2
A parseLiteral() 0 8 2
A isValid() 0 3 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Ecodev\Felix\Api\Scalar;
6
7
use GraphQL\Language\AST\Node;
8
9
class CountryCode2Type extends AbstractStringBasedType
10
{
11
    public ?string $description = 'ISO 3166-1 alpha-2 two letter country code';
12
13
    public const countryCodes = [
14
        'AD', // Andorra
15
        'AE', // United Arab Emirates
16
        'AF', // Afghanistan
17
        'AG', // Antigua and Barbuda
18
        'AI', // Anguilla
19
        'AL', // Albania
20
        'AM', // Armenia
21
        'AO', // Angola
22
        'AQ', // Antarctica
23
        'AR', // Argentina
24
        'AS', // American Samoa
25
        'AT', // Austria
26
        'AU', // Australia
27
        'AW', // Aruba
28
        'AX', // Åland Islands
29
        'AZ', // Azerbaijan
30
        'BA', // Bosnia and Herzegovina
31
        'BB', // Barbados
32
        'BD', // Bangladesh
33
        'BE', // Belgium
34
        'BF', // Burkina Faso
35
        'BG', // Bulgaria
36
        'BH', // Bahrain
37
        'BI', // Burundi
38
        'BJ', // Benin
39
        'BL', // Saint Barthélemy
40
        'BM', // Bermuda
41
        'BN', // Brunei Darussalam
42
        'BO', // Bolivia (Plurinational State of)
43
        'BQ', // Bonaire, Sint Eustatius and Saba
44
        'BR', // Brazil
45
        'BS', // Bahamas
46
        'BT', // Bhutan
47
        'BV', // Bouvet Island
48
        'BW', // Botswana
49
        'BY', // Belarus
50
        'BZ', // Belize
51
        'CA', // Canada
52
        'CC', // Cocos (Keeling) Islands
53
        'CD', // Congo (Democratic Republic of the)
54
        'CF', // Central African Republic
55
        'CG', // Congo
56
        'CH', // Switzerland
57
        'CI', // Côte d'Ivoire
58
        'CK', // Cook Islands
59
        'CL', // Chile
60
        'CM', // Cameroon
61
        'CN', // China
62
        'CO', // Colombia
63
        'CR', // Costa Rica
64
        'CU', // Cuba
65
        'CV', // Cabo Verde
66
        'CW', // Curaçao
67
        'CX', // Christmas Island
68
        'CY', // Cyprus
69
        'CZ', // Czech Republic
70
        'DE', // Germany
71
        'DJ', // Djibouti
72
        'DK', // Denmark
73
        'DM', // Dominica
74
        'DO', // Dominican Republic
75
        'DZ', // Algeria
76
        'EC', // Ecuador
77
        'EE', // Estonia
78
        'EG', // Egypt
79
        'EH', // Western Sahara
80
        'ER', // Eritrea
81
        'ES', // Spain
82
        'ET', // Ethiopia
83
        'FI', // Finland
84
        'FJ', // Fiji
85
        'FK', // Falkland Islands (Malvinas)
86
        'FM', // Micronesia (Federated States of)
87
        'FO', // Faroe Islands
88
        'FR', // France
89
        'GA', // Gabon
90
        'GB', // United Kingdom of Great Britain and Northern Ireland
91
        'GD', // Grenada
92
        'GE', // Georgia
93
        'GF', // French Guiana
94
        'GG', // Guernsey
95
        'GH', // Ghana
96
        'GI', // Gibraltar
97
        'GL', // Greenland
98
        'GM', // Gambia
99
        'GN', // Guinea
100
        'GP', // Guadeloupe
101
        'GQ', // Equatorial Guinea
102
        'GR', // Greece
103
        'GS', // South Georgia and the South Sandwich Islands
104
        'GT', // Guatemala
105
        'GU', // Guam
106
        'GW', // Guinea-Bissau
107
        'GY', // Guyana
108
        'HK', // Hong Kong
109
        'HM', // Heard Island and McDonald Islands
110
        'HN', // Honduras
111
        'HR', // Croatia
112
        'HT', // Haiti
113
        'HU', // Hungary
114
        'ID', // Indonesia
115
        'IE', // Ireland
116
        'IL', // Israel
117
        'IM', // Isle of Man
118
        'IN', // India
119
        'IO', // British Indian Ocean Territory
120
        'IQ', // Iraq
121
        'IR', // Iran (Islamic Republic of)
122
        'IS', // Iceland
123
        'IT', // Italy
124
        'JE', // Jersey
125
        'JM', // Jamaica
126
        'JO', // Jordan
127
        'JP', // Japan
128
        'KE', // Kenya
129
        'KG', // Kyrgyzstan
130
        'KH', // Cambodia
131
        'KI', // Kiribati
132
        'KM', // Comoros
133
        'KN', // Saint Kitts and Nevis
134
        'KP', // Korea (Democratic People's Republic of)
135
        'KR', // Korea (Republic of)
136
        'KW', // Kuwait
137
        'KY', // Cayman Islands
138
        'KZ', // Kazakhstan
139
        'LA', // Lao People's Democratic Republic
140
        'LB', // Lebanon
141
        'LC', // Saint Lucia
142
        'LI', // Liechtenstein
143
        'LK', // Sri Lanka
144
        'LR', // Liberia
145
        'LS', // Lesotho
146
        'LT', // Lithuania
147
        'LU', // Luxembourg
148
        'LV', // Latvia
149
        'LY', // Libya
150
        'MA', // Morocco
151
        'MC', // Monaco
152
        'MD', // Moldova (Republic of)
153
        'ME', // Montenegro
154
        'MF', // Saint Martin (French part)
155
        'MG', // Madagascar
156
        'MH', // Marshall Islands
157
        'MK', // North Macedonia
158
        'ML', // Mali
159
        'MM', // Myanmar
160
        'MN', // Mongolia
161
        'MO', // Macao
162
        'MP', // Northern Mariana Islands
163
        'MQ', // Martinique
164
        'MR', // Mauritania
165
        'MS', // Montserrat
166
        'MT', // Malta
167
        'MU', // Mauritius
168
        'MV', // Maldives
169
        'MW', // Malawi
170
        'MX', // Mexico
171
        'MY', // Malaysia
172
        'MZ', // Mozambique
173
        'NA', // Namibia
174
        'NC', // New Caledonia
175
        'NE', // Niger
176
        'NF', // Norfolk Island
177
        'NG', // Nigeria
178
        'NI', // Nicaragua
179
        'NL', // Netherlands
180
        'NO', // Norway
181
        'NP', // Nepal
182
        'NR', // Nauru
183
        'NU', // Niue
184
        'NZ', // New Zealand
185
        'OM', // Oman
186
        'PA', // Panama
187
        'PE', // Peru
188
        'PF', // French Polynesia
189
        'PG', // Papua New Guinea
190
        'PH', // Philippines
191
        'PK', // Pakistan
192
        'PL', // Poland
193
        'PM', // Saint Pierre and Miquelon
194
        'PN', // Pitcairn
195
    ];
196
197
    /**
198
     * Parse lowercase value and convert to standard uppercase.
199
     */
200 6
    public function parseValue(mixed $value): ?string
201
    {
202 6
        $parsed = parent::parseValue($value);
203 2
        if (is_string($parsed)) {
204 2
            $parsed = mb_strtoupper($parsed);
205
        }
206
207 2
        return $parsed;
208
    }
209
210
    /**
211
     * Parse literal lowercase and convert to standard uppercase.
212
     */
213 7
    public function parseLiteral(Node $valueNode, ?array $variables = null): ?string
214
    {
215 7
        $parsed = parent::parseLiteral($valueNode, $variables);
216 2
        if (is_string($parsed)) {
0 ignored issues
show
introduced by
The condition is_string($parsed) is always true.
Loading history...
217 2
            $parsed = mb_strtoupper($parsed);
218
        }
219
220 2
        return $parsed;
221
    }
222
223
    /**
224
     * Serializes an internal value and convert to uppercase.
225
     */
226 6
    public function serialize(mixed $value): mixed
227
    {
228
        // Assuming internal representation is always correct:
229 6
        if (is_string($value)) {
230 6
            $value = mb_strtoupper($value);
231
        }
232
233 6
        return $value;
234
    }
235
236
    /**
237
     * Validate a country code.
238
     */
239 12
    protected function isValid(?string $value): bool
240
    {
241 12
        return is_string($value) && mb_strlen($value) === 2 && in_array(mb_strtoupper($value), self::countryCodes, true);
242
    }
243
}
244