1
0
Fork 0
mirror of https://github.com/archtechx/enums.git synced 2025-12-12 06:44:04 +00:00

Support UPPER_SNAKE_CASE and PascalCase in stringOptions() (resolve #22)

This commit is contained in:
Samuel Štancl 2024-01-28 18:50:31 +01:00
parent fc428d533d
commit fea911eba7
3 changed files with 59 additions and 1 deletions

View file

@ -41,7 +41,20 @@ trait Options
} }
// Default callback // Default callback
$callback ??= fn ($name, $value) => "<option value=\"{$value}\">" . ucfirst(strtolower($name)) . '</option>'; $callback ??= function ($name, $value) {
if (str_contains($name, '_')) {
// Snake case
$words = explode('_', $name);
} else if (strtoupper($name) === $name) {
// If the entire name is uppercase without underscores, it's a single word
$words = [$name];
} else {
// Pascal case or camel case
$words = array_filter(preg_split('/(?=[A-Z])/', $name));
}
return "<option value=\"{$value}\">" . ucfirst(strtolower(implode(' ', $words))) . '</option>';
};
$options = array_map($callback, array_keys($options), array_values($options)); $options = array_map($callback, array_keys($options), array_values($options));

View file

@ -61,3 +61,35 @@ enum Role
#[Instructions('Guest users can only view the existing records')] #[Instructions('Guest users can only view the existing records')]
case GUEST; case GUEST;
} }
enum MultiWordSnakeCaseEnum
{
use Options;
case FOO_BAR;
case BAR_BAZ;
}
enum BackedMultiWordSnakeCaseEnum: int
{
use Options;
case FOO_BAR = 0;
case BAR_BAZ = 1;
}
enum PascalCaseEnum
{
use Options;
case FooBar;
case BarBaz;
}
enum BackedPascalCaseEnum: int
{
use Options;
case FooBar = 0;
case BarBaz = 1;
}

View file

@ -27,3 +27,16 @@ it('returns default HTML options from backed enums')
it('returns default HTML options from pure enums') it('returns default HTML options from pure enums')
->expect(Role::stringOptions()) ->expect(Role::stringOptions())
->toBe('<option value="ADMIN">Admin</option>\n<option value="GUEST">Guest</option>'); ->toBe('<option value="ADMIN">Admin</option>\n<option value="GUEST">Guest</option>');
it('returns default HTML options from pure enums with snake case')
->expect(MultiWordSnakeCaseEnum::stringOptions())
->toBe('<option value="FOO_BAR">Foo bar</option>\n<option value="BAR_BAZ">Bar baz</option>');
it('returns default HTML options from backed enums with snake case')
->expect(BackedMultiWordSnakeCaseEnum::stringOptions())
->toBe('<option value="0">Foo bar</option>\n<option value="1">Bar baz</option>');
it('returns default HTML options from pure enums with pascal case')
->expect(BackedPascalCaseEnum::stringOptions())
->toBe('<option value="0">Foo bar</option>\n<option value="1">Bar baz</option>');