Skip to content

Commit 5d6028b

Browse files
authored
Add enum support for defined rule set names (#46)
1 parent 6c8d6cb commit 5d6028b

File tree

6 files changed

+83
-10
lines changed

6 files changed

+83
-10
lines changed

src/Contracts/DefinedRuleSets.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@
44

55
namespace Sourcetoad\RuleHelper\Contracts;
66

7+
use BackedEnum;
78
use Sourcetoad\RuleHelper\RuleSet;
9+
use UnitEnum;
810

911
interface DefinedRuleSets
1012
{
11-
public function define(string $name, RuleSet $ruleSet): void;
13+
public function define(string|BackedEnum|UnitEnum $name, RuleSet $ruleSet): void;
1214

13-
public function useDefined(string $name): RuleSet;
15+
public function useDefined(string|BackedEnum|UnitEnum $name): RuleSet;
1416
}

src/DefinedRuleSets.php

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,43 @@
44

55
namespace Sourcetoad\RuleHelper;
66

7+
use BackedEnum;
8+
use InvalidArgumentException;
9+
use UnitEnum;
10+
711
class DefinedRuleSets implements Contracts\DefinedRuleSets
812
{
913
/** @var array<string, RuleSet> */
1014
private array $definedRules = [];
1115

12-
public function define(string $name, RuleSet $ruleSet): void
16+
public function define(string|BackedEnum|UnitEnum $name, RuleSet $ruleSet): void
17+
{
18+
$key = $this->getKey($name);
19+
20+
$this->definedRules[$key] = $ruleSet;
21+
}
22+
23+
public function useDefined(string|BackedEnum|UnitEnum $name): RuleSet
1324
{
14-
$this->definedRules[$name] = $ruleSet;
25+
$key = $this->getKey($name);
26+
27+
if (!array_key_exists($key, $this->definedRules)) {
28+
throw new InvalidArgumentException('No rule defined with name '.$key);
29+
}
30+
31+
return $this->definedRules[$key];
1532
}
1633

17-
public function useDefined(string $name): RuleSet
34+
private function getKey(string|BackedEnum|UnitEnum $value): string
1835
{
19-
if (!array_key_exists($name, $this->definedRules)) {
20-
throw new \InvalidArgumentException('No rule defined with name '.$name);
36+
if ($value instanceof UnitEnum) {
37+
return sprintf(
38+
'%s::%s',
39+
$value::class,
40+
$value instanceof BackedEnum ? $value->value : $value->name,
41+
);
2142
}
2243

23-
return $this->definedRules[$name];
44+
return $value;
2445
}
2546
}

src/RuleSet.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,15 @@ public static function create(array $rules = []): self
6464
/**
6565
* Defines a rule set to be re-used later.
6666
*/
67-
public static function define(string $name, RuleSet $ruleSet): void
67+
public static function define(string|BackedEnum|UnitEnum $name, RuleSet $ruleSet): void
6868
{
6969
static::getDefinedRuleSets()->define($name, $ruleSet);
7070
}
7171

7272
/**
7373
* Uses a previously defined rule set.
7474
*/
75-
public static function useDefined(string $name): RuleSet
75+
public static function useDefined(string|BackedEnum|UnitEnum $name): RuleSet
7676
{
7777
return static::getDefinedRuleSets()->useDefined($name);
7878
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Sourcetoad\RuleHelper\Tests\Stubs;
6+
7+
enum ExampleNonBackedEnum
8+
{
9+
case Value;
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Sourcetoad\RuleHelper\Tests\Stubs;
6+
7+
enum ExampleStringDuplicateEnum: string
8+
{
9+
case Another = 'another';
10+
}

tests/Unit/DefinedRuleSetsTest.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
use Sourcetoad\RuleHelper\Contracts\DefinedRuleSets;
1010
use Sourcetoad\RuleHelper\RuleHelperServiceProvider;
1111
use Sourcetoad\RuleHelper\RuleSet;
12+
use Sourcetoad\RuleHelper\Tests\Stubs\ExampleNonBackedEnum;
13+
use Sourcetoad\RuleHelper\Tests\Stubs\ExampleStringDuplicateEnum;
14+
use Sourcetoad\RuleHelper\Tests\Stubs\ExampleStringEnum;
1215
use Sourcetoad\RuleHelper\Tests\TestCase;
1316

1417
class DefinedRuleSetsTest extends TestCase
@@ -88,4 +91,31 @@ public function testConcatDefinedRuleSet(): void
8891
// Assert
8992
$this->assertSame(['required', 'email'], $ruleSet->toArray());
9093
}
94+
95+
public function testWorksWithNonBackedEnums(): void
96+
{
97+
// Arrange
98+
RuleSet::define(ExampleNonBackedEnum::Value, RuleSet::create()->email());
99+
100+
// Act
101+
$ruleSet = RuleSet::useDefined(ExampleNonBackedEnum::Value);
102+
103+
// Assert
104+
$this->assertSame(['email'], $ruleSet->toArray());
105+
}
106+
107+
public function testDefinedEnumsWithDuplicateValuesAreTreatedAsDifferent(): void
108+
{
109+
// Arrange
110+
RuleSet::define(ExampleStringEnum::Another, RuleSet::create()->email());
111+
RuleSet::define(ExampleStringDuplicateEnum::Another, RuleSet::create()->required());
112+
113+
// Act
114+
$ruleSetOne = RuleSet::useDefined(ExampleStringEnum::Another);
115+
$ruleSetTwo = RuleSet::useDefined(ExampleStringDuplicateEnum::Another);
116+
117+
// Assert
118+
$this->assertSame(['email'], $ruleSetOne->toArray());
119+
$this->assertSame(['required'], $ruleSetTwo->toArray());
120+
}
91121
}

0 commit comments

Comments
 (0)