Skip to content

Commit

Permalink
Add support for nullable enums
Browse files Browse the repository at this point in the history
  • Loading branch information
rubenvanassche committed May 11, 2023
1 parent 52a2d65 commit 97b1043
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 3 deletions.
12 changes: 10 additions & 2 deletions src/SettingsCasts/EnumCast.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,12 @@ public function __construct(string $enum)
$this->enum = $enum;
}

public function get($payload): UnitEnum
public function get($payload): ?UnitEnum
{
if($payload === null){
return null;
}

if (is_a($this->enum, BackedEnum::class, true)) {
return $this->enum::from($payload);
}
Expand All @@ -32,8 +36,12 @@ public function get($payload): UnitEnum
throw new Exception('Invalid enum');
}

public function set($payload): string|int
public function set($payload): string|int|null
{
if($payload === null){
return null;
}

if ($payload instanceof BackedEnum) {
return $payload->value;
}
Expand Down
1 change: 0 additions & 1 deletion tests/Factories/SettingsCastFactoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,6 @@
expect(new EnumCast(DummyUnitEnum::class))->toEqual(SettingsCastFactory::resolve(new ReflectionProperty($fake, 'unit'), []));
expect(new EnumCast(DummyIntEnum::class))->toEqual(SettingsCastFactory::resolve(new ReflectionProperty($fake, 'int'), []));
expect(new EnumCast(DummyStringEnum::class))->toEqual(SettingsCastFactory::resolve(new ReflectionProperty($fake, 'string'), []));

expect(new EnumCast(DummyStringEnum::class))->toEqual(SettingsCastFactory::resolve(new ReflectionProperty($fake, 'annotated'), []));
});

Expand Down
33 changes: 33 additions & 0 deletions tests/SettingsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -724,3 +724,36 @@ public static function group(): string
expect($name)->toEqual('Louis Armstrong');
expect($log)->toHaveCount(0);
});


it('it can use enums which are null', function () {
$this->skipIfPHPLowerThen('8.1');

resolve(SettingsMigrator::class)->inGroup('dummy_simple', function (SettingsBlueprint $blueprint): void {
$blueprint->add('name');
});

$class = new class extends Settings {
public ?DummyStringEnum $name;

public static function group(): string
{
return 'dummy_simple';
}
};

/** @var \Spatie\LaravelSettings\Tests\TestClasses\DummySimpleSettings $settings */
$settings = resolve(get_class($class));

expect($settings->name)->toBeNull();

$settings->name = DummyStringEnum::ARCHIVED;
$settings->save();

expect($settings->name)->toBe(DummyStringEnum::ARCHIVED);

$settings->name = null;
$settings->save();

expect($settings->name)->toBeNull();
});

0 comments on commit 97b1043

Please sign in to comment.