diff --git a/src/Extension/EnumExtension.php b/src/Extension/EnumExtension.php new file mode 100644 index 0000000000..1c33404c6a --- /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 0000000000..c95b32a154 --- /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; + } +}