Skip to content

Commit d73ccf5

Browse files
committed
Implement create() & tryCreate() for FileExtension & MediaType
1 parent 5e4f263 commit d73ccf5

File tree

4 files changed

+160
-0
lines changed

4 files changed

+160
-0
lines changed

src/FileExtension.php

+52
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
namespace Intervention\Image;
66

7+
use Error;
8+
use Intervention\Image\Exceptions\NotSupportedException;
9+
710
enum FileExtension: string
811
{
912
case JPG = 'jpg';
@@ -27,6 +30,55 @@ enum FileExtension: string
2730
case HEIC = 'heic';
2831
case HEIF = 'heif';
2932

33+
/**
34+
* Create file extension from given identifier
35+
*
36+
* @param string|Format|MediaType|FileExtension $identifier
37+
* @throws NotSupportedException
38+
* @return FileExtension
39+
*/
40+
public static function create(string|self|Format|MediaType $identifier): self
41+
{
42+
if ($identifier instanceof self) {
43+
return $identifier;
44+
}
45+
46+
if ($identifier instanceof Format) {
47+
return $identifier->fileExtension();
48+
}
49+
50+
if ($identifier instanceof MediaType) {
51+
return $identifier->fileExtension();
52+
}
53+
54+
try {
55+
$extension = FileExtension::from(strtolower($identifier));
56+
} catch (Error) {
57+
try {
58+
$extension = MediaType::from(strtolower($identifier))->fileExtension();
59+
} catch (Error) {
60+
throw new NotSupportedException('Unable to create file extension from "' . $identifier . '".');
61+
}
62+
}
63+
64+
return $extension;
65+
}
66+
67+
/**
68+
* Try to create media type from given identifier and return null on failure
69+
*
70+
* @param string|Format|MediaType|FileExtension $identifier
71+
* @return FileExtension|null
72+
*/
73+
public static function tryCreate(string|self|Format|MediaType $identifier): ?self
74+
{
75+
try {
76+
return self::create($identifier);
77+
} catch (NotSupportedException) {
78+
return null;
79+
}
80+
}
81+
3082
/**
3183
* Return the matching format for the current file extension
3284
*

src/MediaType.php

+52
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
namespace Intervention\Image;
66

7+
use Error;
8+
use Intervention\Image\Exceptions\NotSupportedException;
9+
710
enum MediaType: string
811
{
912
case IMAGE_JPEG = 'image/jpeg';
@@ -35,6 +38,55 @@ enum MediaType: string
3538
case IMAGE_X_HEIC = 'image/x-heic';
3639
case IMAGE_HEIF = 'image/heif';
3740

41+
/**
42+
* Create media type from given identifier
43+
*
44+
* @param string|Format|MediaType|FileExtension $identifier
45+
* @throws NotSupportedException
46+
* @return MediaType
47+
*/
48+
public static function create(string|self|Format|FileExtension $identifier): self
49+
{
50+
if ($identifier instanceof self) {
51+
return $identifier;
52+
}
53+
54+
if ($identifier instanceof Format) {
55+
return $identifier->mediaType();
56+
}
57+
58+
if ($identifier instanceof FileExtension) {
59+
return $identifier->mediaType();
60+
}
61+
62+
try {
63+
$type = MediaType::from(strtolower($identifier));
64+
} catch (Error) {
65+
try {
66+
$type = FileExtension::from(strtolower($identifier))->mediaType();
67+
} catch (Error) {
68+
throw new NotSupportedException('Unable to create media type from "' . $identifier . '".');
69+
}
70+
}
71+
72+
return $type;
73+
}
74+
75+
/**
76+
* Try to create media type from given identifier and return null on failure
77+
*
78+
* @param string|Format|MediaType|FileExtension $identifier
79+
* @return MediaType|null
80+
*/
81+
public static function tryCreate(string|self|Format|FileExtension $identifier): ?self
82+
{
83+
try {
84+
return self::create($identifier);
85+
} catch (NotSupportedException) {
86+
return null;
87+
}
88+
}
89+
3890
/**
3991
* Return the matching format for the current media (MIME) type
4092
*

tests/Unit/FileExtensionTest.php

+28
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Intervention\Image\Tests\Unit;
66

77
use Generator;
8+
use Intervention\Image\Exceptions\NotSupportedException;
89
use Intervention\Image\FileExtension;
910
use Intervention\Image\Format;
1011
use Intervention\Image\MediaType;
@@ -15,6 +16,33 @@
1516
#[CoversClass(FileExtension::class)]
1617
final class FileExtensionTest extends BaseTestCase
1718
{
19+
public function testCreate(): void
20+
{
21+
$this->assertEquals(FileExtension::JPG, FileExtension::create(MediaType::IMAGE_JPEG));
22+
$this->assertEquals(FileExtension::JPG, FileExtension::create(Format::JPEG));
23+
$this->assertEquals(FileExtension::JPG, FileExtension::create(FileExtension::JPG));
24+
$this->assertEquals(FileExtension::JPG, FileExtension::create('jpg'));
25+
$this->assertEquals(FileExtension::JPEG, FileExtension::create('jpeg'));
26+
$this->assertEquals(FileExtension::JPG, FileExtension::create('image/jpeg'));
27+
}
28+
29+
public function testCreateUnknown(): void
30+
{
31+
$this->expectException(NotSupportedException::class);
32+
FileExtension::create('foo');
33+
}
34+
35+
public function testTryCreate(): void
36+
{
37+
$this->assertEquals(FileExtension::JPG, FileExtension::tryCreate(MediaType::IMAGE_JPEG));
38+
$this->assertEquals(FileExtension::JPG, FileExtension::tryCreate(Format::JPEG));
39+
$this->assertEquals(FileExtension::JPG, FileExtension::tryCreate(FileExtension::JPG));
40+
$this->assertEquals(FileExtension::JPG, FileExtension::tryCreate('jpg'));
41+
$this->assertEquals(FileExtension::JPEG, FileExtension::tryCreate('jpeg'));
42+
$this->assertEquals(FileExtension::JPG, FileExtension::tryCreate('image/jpeg'));
43+
$this->assertNull(FileExtension::tryCreate('no-format'));
44+
}
45+
1846
public function testFormatJpeg(): void
1947
{
2048
$ext = FileExtension::JPEG;

tests/Unit/MediaTypeTest.php

+28
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Intervention\Image\Tests\Unit;
66

77
use Generator;
8+
use Intervention\Image\Exceptions\NotSupportedException;
89
use Intervention\Image\FileExtension;
910
use Intervention\Image\Format;
1011
use Intervention\Image\MediaType;
@@ -15,6 +16,33 @@
1516
#[CoversClass(MediaType::class)]
1617
final class MediaTypeTest extends BaseTestCase
1718
{
19+
public function testCreate(): void
20+
{
21+
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::create(MediaType::IMAGE_JPEG));
22+
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::create(Format::JPEG));
23+
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::create(FileExtension::JPG));
24+
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::create('jpg'));
25+
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::create('jpeg'));
26+
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::create('image/jpeg'));
27+
}
28+
29+
public function testCreateUnknown(): void
30+
{
31+
$this->expectException(NotSupportedException::class);
32+
MediaType::create('foo');
33+
}
34+
35+
public function testTryCreate(): void
36+
{
37+
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::tryCreate(MediaType::IMAGE_JPEG));
38+
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::tryCreate(Format::JPEG));
39+
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::tryCreate(FileExtension::JPG));
40+
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::tryCreate('jpg'));
41+
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::tryCreate('jpeg'));
42+
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::tryCreate('image/jpeg'));
43+
$this->assertNull(Format::tryCreate('no-format'));
44+
}
45+
1846
public function testFormatJpeg(): void
1947
{
2048
$mime = MediaType::IMAGE_JPEG;

0 commit comments

Comments
 (0)