From 6ed6012ec7a848b4232b489ba5d71c132a4e268f Mon Sep 17 00:00:00 2001 From: Jules Pietri Date: Tue, 22 Aug 2023 11:55:27 +0200 Subject: [PATCH] Add `enum_cases` function --- src/Extension/EnumExtension.php | 40 +++++++++++++++++++++ tests/Extension/EnumExtensionTest.php | 50 +++++++++++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 src/Extension/EnumExtension.php create mode 100644 tests/Extension/EnumExtensionTest.php diff --git a/src/Extension/EnumExtension.php b/src/Extension/EnumExtension.php new file mode 100644 index 00000000000..1c33404c6a1 --- /dev/null +++ b/src/Extension/EnumExtension.php @@ -0,0 +1,40 @@ + $backedEnum + * + * @return T[] + */ + public static function enumCases(string $backedEnum): array + { + if (!is_a($backedEnum, \BackedEnum::class, true)) { + throw new \InvalidArgumentException(sprintf('The enum must be a "\BackedEnum", "%s" given.', $backedEnum)); + } + + return $backedEnum::cases(); + } +} diff --git a/tests/Extension/EnumExtensionTest.php b/tests/Extension/EnumExtensionTest.php new file mode 100644 index 00000000000..c95b32a1549 --- /dev/null +++ b/tests/Extension/EnumExtensionTest.php @@ -0,0 +1,50 @@ +assertSame(MyBackedEnum::cases(), $cases); + } + + public function testEnumCasesThrowsIfNotBacked() + { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('The enum must be a "\BackedEnum", "Twig\Tests\Extension\MyUnitEnum" given.'); + + EnumExtension::enumCases(MyUnitEnum::class); + } +} + +if (80100 <= \PHP_VERSION_ID) { + enum MyBackedEnum: string + { + case ONE = 'one'; + case TWO = 'two'; + } + + enum MyUnitEnum + { + case ONE; + case TWO; + } +}