Skip to content

Commit

Permalink
Implement create() & tryCreate() for FileExtension & MediaType
Browse files Browse the repository at this point in the history
  • Loading branch information
olivervogel committed Feb 4, 2025
1 parent 5e4f263 commit d73ccf5
Show file tree
Hide file tree
Showing 4 changed files with 160 additions and 0 deletions.
52 changes: 52 additions & 0 deletions src/FileExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

namespace Intervention\Image;

use Error;
use Intervention\Image\Exceptions\NotSupportedException;

enum FileExtension: string
{
case JPG = 'jpg';
Expand All @@ -27,6 +30,55 @@ enum FileExtension: string
case HEIC = 'heic';
case HEIF = 'heif';

/**
* Create file extension from given identifier
*
* @param string|Format|MediaType|FileExtension $identifier
* @throws NotSupportedException
* @return FileExtension
*/
public static function create(string|self|Format|MediaType $identifier): self
{
if ($identifier instanceof self) {
return $identifier;
}

if ($identifier instanceof Format) {
return $identifier->fileExtension();
}

if ($identifier instanceof MediaType) {
return $identifier->fileExtension();
}

try {
$extension = FileExtension::from(strtolower($identifier));
} catch (Error) {
try {
$extension = MediaType::from(strtolower($identifier))->fileExtension();
} catch (Error) {
throw new NotSupportedException('Unable to create file extension from "' . $identifier . '".');
}
}

return $extension;
}

/**
* Try to create media type from given identifier and return null on failure
*
* @param string|Format|MediaType|FileExtension $identifier
* @return FileExtension|null
*/
public static function tryCreate(string|self|Format|MediaType $identifier): ?self
{
try {
return self::create($identifier);
} catch (NotSupportedException) {
return null;
}
}

/**
* Return the matching format for the current file extension
*
Expand Down
52 changes: 52 additions & 0 deletions src/MediaType.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

namespace Intervention\Image;

use Error;
use Intervention\Image\Exceptions\NotSupportedException;

enum MediaType: string
{
case IMAGE_JPEG = 'image/jpeg';
Expand Down Expand Up @@ -35,6 +38,55 @@ enum MediaType: string
case IMAGE_X_HEIC = 'image/x-heic';
case IMAGE_HEIF = 'image/heif';

/**
* Create media type from given identifier
*
* @param string|Format|MediaType|FileExtension $identifier
* @throws NotSupportedException
* @return MediaType
*/
public static function create(string|self|Format|FileExtension $identifier): self
{
if ($identifier instanceof self) {
return $identifier;
}

if ($identifier instanceof Format) {
return $identifier->mediaType();
}

if ($identifier instanceof FileExtension) {
return $identifier->mediaType();
}

try {
$type = MediaType::from(strtolower($identifier));
} catch (Error) {
try {
$type = FileExtension::from(strtolower($identifier))->mediaType();
} catch (Error) {
throw new NotSupportedException('Unable to create media type from "' . $identifier . '".');
}
}

return $type;
}

/**
* Try to create media type from given identifier and return null on failure
*
* @param string|Format|MediaType|FileExtension $identifier
* @return MediaType|null
*/
public static function tryCreate(string|self|Format|FileExtension $identifier): ?self
{
try {
return self::create($identifier);
} catch (NotSupportedException) {
return null;
}
}

/**
* Return the matching format for the current media (MIME) type
*
Expand Down
28 changes: 28 additions & 0 deletions tests/Unit/FileExtensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace Intervention\Image\Tests\Unit;

use Generator;
use Intervention\Image\Exceptions\NotSupportedException;
use Intervention\Image\FileExtension;
use Intervention\Image\Format;
use Intervention\Image\MediaType;
Expand All @@ -15,6 +16,33 @@
#[CoversClass(FileExtension::class)]
final class FileExtensionTest extends BaseTestCase
{
public function testCreate(): void
{
$this->assertEquals(FileExtension::JPG, FileExtension::create(MediaType::IMAGE_JPEG));
$this->assertEquals(FileExtension::JPG, FileExtension::create(Format::JPEG));
$this->assertEquals(FileExtension::JPG, FileExtension::create(FileExtension::JPG));
$this->assertEquals(FileExtension::JPG, FileExtension::create('jpg'));
$this->assertEquals(FileExtension::JPEG, FileExtension::create('jpeg'));
$this->assertEquals(FileExtension::JPG, FileExtension::create('image/jpeg'));
}

public function testCreateUnknown(): void
{
$this->expectException(NotSupportedException::class);
FileExtension::create('foo');
}

public function testTryCreate(): void
{
$this->assertEquals(FileExtension::JPG, FileExtension::tryCreate(MediaType::IMAGE_JPEG));
$this->assertEquals(FileExtension::JPG, FileExtension::tryCreate(Format::JPEG));
$this->assertEquals(FileExtension::JPG, FileExtension::tryCreate(FileExtension::JPG));
$this->assertEquals(FileExtension::JPG, FileExtension::tryCreate('jpg'));
$this->assertEquals(FileExtension::JPEG, FileExtension::tryCreate('jpeg'));
$this->assertEquals(FileExtension::JPG, FileExtension::tryCreate('image/jpeg'));
$this->assertNull(FileExtension::tryCreate('no-format'));
}

public function testFormatJpeg(): void
{
$ext = FileExtension::JPEG;
Expand Down
28 changes: 28 additions & 0 deletions tests/Unit/MediaTypeTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
namespace Intervention\Image\Tests\Unit;

use Generator;
use Intervention\Image\Exceptions\NotSupportedException;
use Intervention\Image\FileExtension;
use Intervention\Image\Format;
use Intervention\Image\MediaType;
Expand All @@ -15,6 +16,33 @@
#[CoversClass(MediaType::class)]
final class MediaTypeTest extends BaseTestCase
{
public function testCreate(): void
{
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::create(MediaType::IMAGE_JPEG));
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::create(Format::JPEG));
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::create(FileExtension::JPG));
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::create('jpg'));
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::create('jpeg'));
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::create('image/jpeg'));
}

public function testCreateUnknown(): void
{
$this->expectException(NotSupportedException::class);
MediaType::create('foo');
}

public function testTryCreate(): void
{
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::tryCreate(MediaType::IMAGE_JPEG));
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::tryCreate(Format::JPEG));
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::tryCreate(FileExtension::JPG));
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::tryCreate('jpg'));
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::tryCreate('jpeg'));
$this->assertEquals(MediaType::IMAGE_JPEG, MediaType::tryCreate('image/jpeg'));
$this->assertNull(Format::tryCreate('no-format'));
}

public function testFormatJpeg(): void
{
$mime = MediaType::IMAGE_JPEG;
Expand Down

0 comments on commit d73ccf5

Please sign in to comment.