From dea16e414cb1a8d2619c38d0edf46fb28651a7a1 Mon Sep 17 00:00:00 2001 From: Samuel Levy Date: Tue, 15 Mar 2022 07:06:53 +1000 Subject: [PATCH] Code review changes Altered `::values()` to act like `::names()` for backed enums, code style fixes, general cleanups --- README.md | 8 ++++---- src/InvokableCases.php | 6 ++++-- src/Options.php | 9 +++++---- src/Values.php | 8 +++++++- tests/Pest/ValuesTest.php | 4 ++-- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index fa352a0..93deb8d 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ composer require archtechx/enums ### InvokableCases -This helper lets you get the value of a backed enum, or the name of a pure enum by "invoking" it — either statically (`MyEnum::FOO()` instead of `MyEnum::FOO`), or as an instance (`$enum()`). +This helper lets you get the value of a backed enum, or the name of a pure enum, by "invoking" it — either statically (`MyEnum::FOO()` instead of `MyEnum::FOO`), or as an instance (`$enum()`). That way, you can use enums as array keys: ```php @@ -122,7 +122,7 @@ Role::names(); // ['ADMINISTRATOR', 'SUBSCRIBER', 'GUEST'] ### Values -This helper returns a list of case *values* in the enum. _**NB:** pure enums don't have values, so this will only ever return an empty array._ +This helper returns a list of case *values* for backed enums, or a list of case *names* for pure enums (making this functionally equivalent to [`::names()`](#names) for pure Enums) #### Apply the trait on your enum ```php @@ -150,12 +150,12 @@ enum Role #### Use the `values()` method ```php TaskStatus::values(); // [0, 1, 2] -Role::values(); // [] +Role::values(); // ['ADMINISTRATOR', 'SUBSCRIBER', 'GUEST'] ``` ### Options -This helper returns an associative array of case names and values for backed enums, or an array of names for pure enums (making this functionally equivalent to `::names()` for pure Enums). +This helper returns an associative array of case names and values for backed enums, or a list of names for pure enums (making this functionally equivalent to [`::names()`](#names) for pure Enums). #### Apply the trait on your enum ```php diff --git a/src/InvokableCases.php b/src/InvokableCases.php index 9a1dbcf..b5a2150 100644 --- a/src/InvokableCases.php +++ b/src/InvokableCases.php @@ -4,12 +4,14 @@ declare(strict_types=1); namespace ArchTech\Enums; +use BackedEnum; + trait InvokableCases { /** Return the enum's value when it's $invoked(). */ public function __invoke() { - return $this->value ?? $this->name; + return $this instanceof BackedEnum ? $this->value : $this->name; } /** Return the enum's value or name when it's called ::STATICALLY(). */ @@ -19,7 +21,7 @@ trait InvokableCases foreach ($cases as $case) { if ($case->name === $name) { - return $case instanceof \BackedEnum ? $case->value : $case->name; + return $case instanceof BackedEnum ? $case->value : $case->name; } } diff --git a/src/Options.php b/src/Options.php index e4d2299..3e55328 100644 --- a/src/Options.php +++ b/src/Options.php @@ -4,16 +4,17 @@ declare(strict_types=1); namespace ArchTech\Enums; +use BackedEnum; + trait Options { /** Get an associative array of [case name => case value]. */ public static function options(): array { $cases = static::cases(); - if (reset($cases) instanceof \BackedEnum) { - return array_column($cases, 'value', 'name'); - } - return array_column($cases, 'name'); + return isset($cases[0]) && $cases[0] instanceof BackedEnum + ? array_column($cases, 'value', 'name') + : array_column($cases, 'name'); } } diff --git a/src/Values.php b/src/Values.php index db6d63e..03a1436 100644 --- a/src/Values.php +++ b/src/Values.php @@ -4,11 +4,17 @@ declare(strict_types=1); namespace ArchTech\Enums; +use BackedEnum; + trait Values { /** Get an array of case values. */ public static function values(): array { - return array_column(static::cases(), 'value'); + $cases = static::cases(); + + return isset($cases[0]) && $cases[0] instanceof BackedEnum + ? array_column($cases, 'value') + : array_column($cases, 'name'); } } diff --git a/tests/Pest/ValuesTest.php b/tests/Pest/ValuesTest.php index d2b5c58..9aea523 100644 --- a/tests/Pest/ValuesTest.php +++ b/tests/Pest/ValuesTest.php @@ -4,6 +4,6 @@ it('can return an array of case values from a backed enum') ->expect(Status::values()) ->toBe([0, 1]); -it('can returns an empty array from a pure enum') +it('can return an array of case names from a pure enum') ->expect(Role::values()) - ->toBe([]); + ->toBe(['ADMIN', 'GUEST']);