-
Notifications
You must be signed in to change notification settings - Fork 0
/
ConfigurableHandlerValidator.php
96 lines (75 loc) · 3.83 KB
/
ConfigurableHandlerValidator.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?php
declare(strict_types = 1);
namespace Nepada\MessageBus\StaticAnalysis;
use Nepada\MessageBus\StaticAnalysis\Rules\ClassExistsRule;
use Nepada\MessageBus\StaticAnalysis\Rules\ClassHasPublicMethodRule;
use Nepada\MessageBus\StaticAnalysis\Rules\ClassIsFinalRule;
use Nepada\MessageBus\StaticAnalysis\Rules\ClassIsReadOnlyRule;
use Nepada\MessageBus\StaticAnalysis\Rules\ClassNameHasSuffixRule;
use Nepada\MessageBus\StaticAnalysis\Rules\MethodHasOneParameterRule;
use Nepada\MessageBus\StaticAnalysis\Rules\MethodParameterNameMatchesRule;
use Nepada\MessageBus\StaticAnalysis\Rules\MethodParameterTypeMatchesRule;
use Nepada\MessageBus\StaticAnalysis\Rules\MethodReturnTypeIsVoidRule;
use Nepada\MessageBus\StaticAnalysis\Rules\ShortClassNameMatchesRule;
final readonly class ConfigurableHandlerValidator implements MessageHandlerValidator
{
private MessageHandlerValidationConfiguration $configuration;
private MessageTypeExtractor $messageTypeExtractor;
public function __construct(MessageHandlerValidationConfiguration $configuration)
{
$this->configuration = $configuration;
$this->messageTypeExtractor = new MessageTypeExtractor();
}
public function validate(HandlerType $handlerType): void
{
$handlerClass = $handlerType->toString();
(new ClassExistsRule())->validate($handlerClass);
if ($this->configuration->shouldHandlerClassBeFinal()) {
(new ClassIsFinalRule())->validate($handlerClass);
}
$handleMethodName = MessageTypeExtractor::METHOD_NAME;
(new ClassHasPublicMethodRule($handleMethodName))->validate($handlerClass);
$handleMethod = ReflectionHelper::requireMethodReflection($handlerClass, $handleMethodName);
(new MethodHasOneParameterRule())->validate($handleMethod);
$parameter = $handleMethod->getParameters()[0];
$parameterName = $this->configuration->getHandleMethodParameterName();
(new MethodParameterNameMatchesRule($parameterName))->validate($parameter);
$parameterType = $this->configuration->getHandleMethodParameterType();
(new MethodParameterTypeMatchesRule($parameterType))->validate($parameter);
(new MethodReturnTypeIsVoidRule())->validate($handleMethod);
$messageType = $this->messageTypeExtractor->extract($handlerType);
if ($this->configuration->shouldMessageClassBeFinal()) {
(new ClassIsFinalRule())->validate($messageType->toString());
}
if ($this->configuration->shouldMessageClassBeReadOnly()) {
(new ClassIsReadOnlyRule())->validate($messageType->toString());
}
$messageClassSuffix = $this->configuration->getMessageClassSuffix();
(new ClassNameHasSuffixRule($messageClassSuffix))->validate($messageType->toString());
$shortMessageName = $messageType->shortName($messageClassSuffix);
$this->validateHandlerClassName($handlerClass, $shortMessageName, $this->configuration);
}
/**
* @throws StaticAnalysisFailedException
*/
private function validateHandlerClassName(string $handlerClass, string $shortMessageName, MessageHandlerValidationConfiguration $configuration): void
{
$expectedHandlerClassShort = sprintf(
'#^%s%s%s$#',
$configuration->getHandlerClassPrefixRegex(),
$shortMessageName,
$configuration->getHandlerClassSuffix(),
);
try {
(new ShortClassNameMatchesRule($expectedHandlerClassShort))->validate($handlerClass);
} catch (StaticAnalysisFailedException $exception) {
throw StaticAnalysisFailedException::with(
sprintf(
'Message handler must match message name. Expected name: "%s"',
$expectedHandlerClassShort,
),
$handlerClass,
);
}
}
}