Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
124 / 124
100.00% covered (success)
100.00%
13 / 13
CRAP
100.00% covered (success)
100.00%
1 / 1
MimeType
100.00% covered (success)
100.00%
124 / 124
100.00% covered (success)
100.00%
13 / 13
17
100.00% covered (success)
100.00%
1 / 1
 isApplication
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isText
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isImage
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isAudio
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isVideo
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isFont
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isMultipart
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 isMedia
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
3
 extensions
100.00% covered (success)
100.00%
51 / 51
100.00% covered (success)
100.00%
1 / 1
1
 label
100.00% covered (success)
100.00%
56 / 56
100.00% covered (success)
100.00%
1 / 1
1
 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
1<?php
2
3declare(strict_types=1);
4
5namespace DevToolbelt\Enums\Http;
6
7use DevToolbelt\Enums\EnumInterface;
8
9enum MimeType: string implements EnumInterface
10{
11    // Application
12    case APPLICATION_JSON = 'application/json';
13    case APPLICATION_XML = 'application/xml';
14    case APPLICATION_PDF = 'application/pdf';
15    case APPLICATION_ZIP = 'application/zip';
16    case APPLICATION_GZIP = 'application/gzip';
17    case APPLICATION_OCTET_STREAM = 'application/octet-stream';
18    case APPLICATION_FORM_URLENCODED = 'application/x-www-form-urlencoded';
19    case APPLICATION_JAVASCRIPT = 'application/javascript';
20    case APPLICATION_LD_JSON = 'application/ld+json';
21    case APPLICATION_MSWORD = 'application/msword';
22    case APPLICATION_DOCX = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
23    case APPLICATION_XLS = 'application/vnd.ms-excel';
24    case APPLICATION_XLSX = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
25    case APPLICATION_PPT = 'application/vnd.ms-powerpoint';
26    case APPLICATION_PPTX = 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
27    case APPLICATION_RAR = 'application/vnd.rar';
28    case APPLICATION_7Z = 'application/x-7z-compressed';
29    case APPLICATION_TAR = 'application/x-tar';
30
31    // Text
32    case TEXT_PLAIN = 'text/plain';
33    case TEXT_HTML = 'text/html';
34    case TEXT_CSS = 'text/css';
35    case TEXT_CSV = 'text/csv';
36    case TEXT_JAVASCRIPT = 'text/javascript';
37    case TEXT_XML = 'text/xml';
38    case TEXT_MARKDOWN = 'text/markdown';
39    case TEXT_CALENDAR = 'text/calendar';
40
41    // Image
42    case IMAGE_PNG = 'image/png';
43    case IMAGE_JPEG = 'image/jpeg';
44    case IMAGE_GIF = 'image/gif';
45    case IMAGE_WEBP = 'image/webp';
46    case IMAGE_SVG = 'image/svg+xml';
47    case IMAGE_ICO = 'image/x-icon';
48    case IMAGE_BMP = 'image/bmp';
49    case IMAGE_TIFF = 'image/tiff';
50    case IMAGE_AVIF = 'image/avif';
51
52    // Audio
53    case AUDIO_MPEG = 'audio/mpeg';
54    case AUDIO_WAV = 'audio/wav';
55    case AUDIO_OGG = 'audio/ogg';
56    case AUDIO_WEBM = 'audio/webm';
57    case AUDIO_AAC = 'audio/aac';
58    case AUDIO_FLAC = 'audio/flac';
59    case AUDIO_MIDI = 'audio/midi';
60
61    // Video
62    case VIDEO_MP4 = 'video/mp4';
63    case VIDEO_WEBM = 'video/webm';
64    case VIDEO_OGG = 'video/ogg';
65    case VIDEO_AVI = 'video/x-msvideo';
66    case VIDEO_MPEG = 'video/mpeg';
67    case VIDEO_QUICKTIME = 'video/quicktime';
68
69    // Font
70    case FONT_WOFF = 'font/woff';
71    case FONT_WOFF2 = 'font/woff2';
72    case FONT_TTF = 'font/ttf';
73    case FONT_OTF = 'font/otf';
74
75    // Multipart
76    case MULTIPART_FORM_DATA = 'multipart/form-data';
77    case MULTIPART_BYTERANGES = 'multipart/byteranges';
78
79    public function isApplication(): bool
80    {
81        return str_starts_with($this->value, 'application/');
82    }
83
84    public function isText(): bool
85    {
86        return str_starts_with($this->value, 'text/');
87    }
88
89    public function isImage(): bool
90    {
91        return str_starts_with($this->value, 'image/');
92    }
93
94    public function isAudio(): bool
95    {
96        return str_starts_with($this->value, 'audio/');
97    }
98
99    public function isVideo(): bool
100    {
101        return str_starts_with($this->value, 'video/');
102    }
103
104    public function isFont(): bool
105    {
106        return str_starts_with($this->value, 'font/');
107    }
108
109    public function isMultipart(): bool
110    {
111        return str_starts_with($this->value, 'multipart/');
112    }
113
114    public function isMedia(): bool
115    {
116        return $this->isImage() || $this->isAudio() || $this->isVideo();
117    }
118
119    /**
120     * @return string[]
121     */
122    public function extensions(): array
123    {
124        return match ($this) {
125            self::APPLICATION_JSON => ['json'],
126            self::APPLICATION_XML, self::TEXT_XML => ['xml'],
127            self::APPLICATION_PDF => ['pdf'],
128            self::APPLICATION_ZIP => ['zip'],
129            self::APPLICATION_GZIP => ['gz', 'gzip'],
130            self::APPLICATION_JAVASCRIPT, self::TEXT_JAVASCRIPT => ['js', 'mjs'],
131            self::APPLICATION_LD_JSON => ['jsonld'],
132            self::APPLICATION_MSWORD => ['doc'],
133            self::APPLICATION_DOCX => ['docx'],
134            self::APPLICATION_XLS => ['xls'],
135            self::APPLICATION_XLSX => ['xlsx'],
136            self::APPLICATION_PPT => ['ppt'],
137            self::APPLICATION_PPTX => ['pptx'],
138            self::APPLICATION_RAR => ['rar'],
139            self::APPLICATION_7Z => ['7z'],
140            self::APPLICATION_TAR => ['tar'],
141            self::TEXT_PLAIN => ['txt'],
142            self::TEXT_HTML => ['html', 'htm'],
143            self::TEXT_CSS => ['css'],
144            self::TEXT_CSV => ['csv'],
145            self::TEXT_MARKDOWN => ['md', 'markdown'],
146            self::TEXT_CALENDAR => ['ics'],
147            self::IMAGE_PNG => ['png'],
148            self::IMAGE_JPEG => ['jpg', 'jpeg'],
149            self::IMAGE_GIF => ['gif'],
150            self::IMAGE_WEBP => ['webp'],
151            self::IMAGE_SVG => ['svg'],
152            self::IMAGE_ICO => ['ico'],
153            self::IMAGE_BMP => ['bmp'],
154            self::IMAGE_TIFF => ['tif', 'tiff'],
155            self::IMAGE_AVIF => ['avif'],
156            self::AUDIO_MPEG => ['mp3'],
157            self::AUDIO_WAV => ['wav'],
158            self::AUDIO_OGG => ['ogg', 'oga'],
159            self::AUDIO_WEBM => ['weba'],
160            self::AUDIO_AAC => ['aac'],
161            self::AUDIO_FLAC => ['flac'],
162            self::AUDIO_MIDI => ['mid', 'midi'],
163            self::VIDEO_MP4 => ['mp4'],
164            self::VIDEO_WEBM => ['webm'],
165            self::VIDEO_OGG => ['ogv'],
166            self::VIDEO_AVI => ['avi'],
167            self::VIDEO_MPEG => ['mpeg', 'mpg'],
168            self::VIDEO_QUICKTIME => ['mov', 'qt'],
169            self::FONT_WOFF => ['woff'],
170            self::FONT_WOFF2 => ['woff2'],
171            self::FONT_TTF => ['ttf'],
172            self::FONT_OTF => ['otf'],
173            default => [],
174        };
175    }
176
177    public function label(): string
178    {
179        return match ($this) {
180            self::APPLICATION_JSON => 'JSON',
181            self::APPLICATION_XML => 'XML',
182            self::APPLICATION_PDF => 'PDF Document',
183            self::APPLICATION_ZIP => 'ZIP Archive',
184            self::APPLICATION_GZIP => 'GZIP Archive',
185            self::APPLICATION_OCTET_STREAM => 'Binary Data',
186            self::APPLICATION_FORM_URLENCODED => 'URL Encoded Form',
187            self::APPLICATION_JAVASCRIPT => 'JavaScript',
188            self::APPLICATION_LD_JSON => 'JSON-LD',
189            self::APPLICATION_MSWORD => 'Microsoft Word',
190            self::APPLICATION_DOCX => 'Microsoft Word (DOCX)',
191            self::APPLICATION_XLS => 'Microsoft Excel',
192            self::APPLICATION_XLSX => 'Microsoft Excel (XLSX)',
193            self::APPLICATION_PPT => 'Microsoft PowerPoint',
194            self::APPLICATION_PPTX => 'Microsoft PowerPoint (PPTX)',
195            self::APPLICATION_RAR => 'RAR Archive',
196            self::APPLICATION_7Z => '7-Zip Archive',
197            self::APPLICATION_TAR => 'TAR Archive',
198            self::TEXT_PLAIN => 'Plain Text',
199            self::TEXT_HTML => 'HTML',
200            self::TEXT_CSS => 'CSS',
201            self::TEXT_CSV => 'CSV',
202            self::TEXT_JAVASCRIPT => 'JavaScript',
203            self::TEXT_XML => 'XML',
204            self::TEXT_MARKDOWN => 'Markdown',
205            self::TEXT_CALENDAR => 'iCalendar',
206            self::IMAGE_PNG => 'PNG Image',
207            self::IMAGE_JPEG => 'JPEG Image',
208            self::IMAGE_GIF => 'GIF Image',
209            self::IMAGE_WEBP => 'WebP Image',
210            self::IMAGE_SVG => 'SVG Image',
211            self::IMAGE_ICO => 'ICO Icon',
212            self::IMAGE_BMP => 'BMP Image',
213            self::IMAGE_TIFF => 'TIFF Image',
214            self::IMAGE_AVIF => 'AVIF Image',
215            self::AUDIO_MPEG => 'MP3 Audio',
216            self::AUDIO_WAV => 'WAV Audio',
217            self::AUDIO_OGG => 'OGG Audio',
218            self::AUDIO_WEBM => 'WebM Audio',
219            self::AUDIO_AAC => 'AAC Audio',
220            self::AUDIO_FLAC => 'FLAC Audio',
221            self::AUDIO_MIDI => 'MIDI Audio',
222            self::VIDEO_MP4 => 'MP4 Video',
223            self::VIDEO_WEBM => 'WebM Video',
224            self::VIDEO_OGG => 'OGG Video',
225            self::VIDEO_AVI => 'AVI Video',
226            self::VIDEO_MPEG => 'MPEG Video',
227            self::VIDEO_QUICKTIME => 'QuickTime Video',
228            self::FONT_WOFF => 'WOFF Font',
229            self::FONT_WOFF2 => 'WOFF2 Font',
230            self::FONT_TTF => 'TrueType Font',
231            self::FONT_OTF => 'OpenType Font',
232            self::MULTIPART_FORM_DATA => 'Multipart Form Data',
233            self::MULTIPART_BYTERANGES => 'Multipart Byte Ranges',
234        };
235    }
236
237    /**
238     * @return string[]
239     */
240    public function labelList(): array
241    {
242        return array_map(fn (self $case) => $case->label(), self::cases());
243    }
244
245    /**
246     * @return array<string, string>
247     */
248    public static function toArray(): array
249    {
250        $result = [];
251
252        foreach (self::cases() as $mimeType) {
253            $result[$mimeType->value] = $mimeType->value;
254        }
255
256        return $result;
257    }
258
259    /**
260     * @return array<string, string>
261     */
262    public static function toArrayWithLabels(): array
263    {
264        $result = [];
265
266        foreach (self::cases() as $mimeType) {
267            $result[$mimeType->value] = $mimeType->label();
268        }
269
270        return $result;
271    }
272}