Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
103 / 103
100.00% covered (success)
100.00%
16 / 16
CRAP
100.00% covered (success)
100.00%
1 / 1
ContactType
100.00% covered (success)
100.00%
103 / 103
100.00% covered (success)
100.00%
16 / 16
22
100.00% covered (success)
100.00%
1 / 1
 label
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
1 / 1
1
 fullNamePtBr
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
1 / 1
1
 icon
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
1 / 1
1
 baseUrl
100.00% covered (success)
100.00%
15 / 15
100.00% covered (success)
100.00%
1 / 1
1
 buildUrl
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
3
 isPhone
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isSocialNetwork
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
1
 isMessenger
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isDigital
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
2
 labelList
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 toArray
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 toArrayWithLabels
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 toArrayPtBr
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 phones
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 socialNetworks
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 messengers
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3declare(strict_types=1);
4
5namespace DevToolbelt\Enums\Personal;
6
7use DevToolbelt\Enums\EnumInterface;
8
9enum ContactType: string implements EnumInterface
10{
11    case EMAIL = 'email';
12    case PHONE = 'phone';
13    case MOBILE = 'mobile';
14    case WHATSAPP = 'whatsapp';
15    case TELEGRAM = 'telegram';
16    case FAX = 'fax';
17    case WEBSITE = 'website';
18    case SKYPE = 'skype';
19    case LINKEDIN = 'linkedin';
20    case FACEBOOK = 'facebook';
21    case INSTAGRAM = 'instagram';
22    case TWITTER = 'twitter';
23    case YOUTUBE = 'youtube';
24    case TIKTOK = 'tiktok';
25    case GITHUB = 'github';
26    case ADDRESS = 'address';
27
28    public function label(): string
29    {
30        return match ($this) {
31            self::EMAIL => 'Email',
32            self::PHONE => 'Phone',
33            self::MOBILE => 'Mobile Phone',
34            self::WHATSAPP => 'WhatsApp',
35            self::TELEGRAM => 'Telegram',
36            self::FAX => 'Fax',
37            self::WEBSITE => 'Website',
38            self::SKYPE => 'Skype',
39            self::LINKEDIN => 'LinkedIn',
40            self::FACEBOOK => 'Facebook',
41            self::INSTAGRAM => 'Instagram',
42            self::TWITTER => 'Twitter / X',
43            self::YOUTUBE => 'YouTube',
44            self::TIKTOK => 'TikTok',
45            self::GITHUB => 'GitHub',
46            self::ADDRESS => 'Address',
47        };
48    }
49
50    public function fullNamePtBr(): string
51    {
52        return match ($this) {
53            self::EMAIL => 'E-mail',
54            self::PHONE => 'Telefone',
55            self::MOBILE => 'Celular',
56            self::WHATSAPP => 'WhatsApp',
57            self::TELEGRAM => 'Telegram',
58            self::FAX => 'Fax',
59            self::WEBSITE => 'Site',
60            self::SKYPE => 'Skype',
61            self::LINKEDIN => 'LinkedIn',
62            self::FACEBOOK => 'Facebook',
63            self::INSTAGRAM => 'Instagram',
64            self::TWITTER => 'Twitter / X',
65            self::YOUTUBE => 'YouTube',
66            self::TIKTOK => 'TikTok',
67            self::GITHUB => 'GitHub',
68            self::ADDRESS => 'Endereço',
69        };
70    }
71
72    public function icon(): string
73    {
74        return match ($this) {
75            self::EMAIL => 'envelope',
76            self::PHONE => 'phone',
77            self::MOBILE => 'mobile',
78            self::WHATSAPP => 'whatsapp',
79            self::TELEGRAM => 'telegram',
80            self::FAX => 'fax',
81            self::WEBSITE => 'globe',
82            self::SKYPE => 'skype',
83            self::LINKEDIN => 'linkedin',
84            self::FACEBOOK => 'facebook',
85            self::INSTAGRAM => 'instagram',
86            self::TWITTER => 'twitter',
87            self::YOUTUBE => 'youtube',
88            self::TIKTOK => 'tiktok',
89            self::GITHUB => 'github',
90            self::ADDRESS => 'map-marker',
91        };
92    }
93
94    public function baseUrl(): ?string
95    {
96        return match ($this) {
97            self::WHATSAPP => 'https://wa.me/',
98            self::TELEGRAM => 'https://t.me/',
99            self::SKYPE => 'skype:',
100            self::LINKEDIN => 'https://linkedin.com/in/',
101            self::FACEBOOK => 'https://facebook.com/',
102            self::INSTAGRAM => 'https://instagram.com/',
103            self::TWITTER => 'https://twitter.com/',
104            self::YOUTUBE => 'https://youtube.com/',
105            self::TIKTOK => 'https://tiktok.com/@',
106            self::GITHUB => 'https://github.com/',
107            self::EMAIL => 'mailto:',
108            self::PHONE, self::MOBILE => 'tel:',
109            default => null,
110        };
111    }
112
113    public function buildUrl(string $value): string
114    {
115        $baseUrl = $this->baseUrl();
116
117        if ($baseUrl === null) {
118            return $value;
119        }
120
121        if ($this === self::WHATSAPP) {
122            $value = preg_replace('/\D/', '', $value);
123        }
124
125        return $baseUrl . $value;
126    }
127
128    public function isPhone(): bool
129    {
130        return in_array($this, [self::PHONE, self::MOBILE, self::WHATSAPP, self::FAX], true);
131    }
132
133    public function isSocialNetwork(): bool
134    {
135        return in_array($this, [
136            self::LINKEDIN,
137            self::FACEBOOK,
138            self::INSTAGRAM,
139            self::TWITTER,
140            self::YOUTUBE,
141            self::TIKTOK,
142            self::GITHUB,
143        ], true);
144    }
145
146    public function isMessenger(): bool
147    {
148        return in_array($this, [self::WHATSAPP, self::TELEGRAM, self::SKYPE], true);
149    }
150
151    public function isDigital(): bool
152    {
153        return $this !== self::ADDRESS && $this !== self::FAX;
154    }
155
156    /**
157     * @return string[]
158     */
159    public function labelList(): array
160    {
161        return array_map(fn (self $case) => $case->label(), self::cases());
162    }
163
164    /**
165     * @return array<string, string>
166     */
167    public static function toArray(): array
168    {
169        $result = [];
170
171        foreach (self::cases() as $type) {
172            $result[$type->value] = $type->value;
173        }
174
175        return $result;
176    }
177
178    /**
179     * @return array<string, string>
180     */
181    public static function toArrayWithLabels(): array
182    {
183        $result = [];
184
185        foreach (self::cases() as $type) {
186            $result[$type->value] = $type->label();
187        }
188
189        return $result;
190    }
191
192    /**
193     * @return array<string, string>
194     */
195    public static function toArrayPtBr(): array
196    {
197        $result = [];
198
199        foreach (self::cases() as $type) {
200            $result[$type->value] = $type->fullNamePtBr();
201        }
202
203        return $result;
204    }
205
206    /**
207     * @return self[]
208     */
209    public static function phones(): array
210    {
211        return array_filter(self::cases(), fn (self $type) => $type->isPhone());
212    }
213
214    /**
215     * @return self[]
216     */
217    public static function socialNetworks(): array
218    {
219        return array_filter(self::cases(), fn (self $type) => $type->isSocialNetwork());
220    }
221
222    /**
223     * @return self[]
224     */
225    public static function messengers(): array
226    {
227        return array_filter(self::cases(), fn (self $type) => $type->isMessenger());
228    }
229}