1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Consolidation\AnnotatedCommand\Hooks\Dispatchers; |
4
|
|
|
|
5
|
|
|
use Consolidation\AnnotatedCommand\ExitCodeInterface; |
6
|
|
|
use Consolidation\AnnotatedCommand\Hooks\HookManager; |
7
|
|
|
use Consolidation\AnnotatedCommand\Hooks\StatusDeterminerInterface; |
8
|
|
|
|
9
|
|
|
/** |
10
|
|
|
* Call hooks |
11
|
|
|
*/ |
12
|
|
View Code Duplication |
class StatusDeterminerHookDispatcher extends HookDispatcher implements StatusDeterminerInterface |
|
|
|
|
13
|
|
|
{ |
14
|
|
|
/** |
15
|
|
|
* Call all status determiners, and see if any of them |
16
|
|
|
* know how to convert to a status code. |
17
|
|
|
*/ |
18
|
|
|
public function determineStatusCode($result) |
19
|
|
|
{ |
20
|
|
|
// If the result (post-processing) is an object that |
21
|
|
|
// implements ExitCodeInterface, then we will ask it |
22
|
|
|
// to give us the status code. |
23
|
|
|
if ($result instanceof ExitCodeInterface) { |
24
|
|
|
return $result->getExitCode(); |
25
|
|
|
} |
26
|
|
|
|
27
|
|
|
$hooks = [ |
28
|
|
|
HookManager::STATUS_DETERMINER, |
29
|
|
|
]; |
30
|
|
|
// If the result does not implement ExitCodeInterface, |
31
|
|
|
// then we'll see if there is a determiner that can |
32
|
|
|
// extract a status code from the result. |
33
|
|
|
$determiners = $this->getHooks($hooks); |
34
|
|
|
foreach ($determiners as $determiner) { |
35
|
|
|
$status = $this->callDeterminer($determiner, $result); |
36
|
|
|
if (isset($status)) { |
37
|
|
|
return $status; |
38
|
|
|
} |
39
|
|
|
} |
40
|
|
|
} |
41
|
|
|
|
42
|
|
|
protected function callDeterminer($determiner, $result) |
43
|
|
|
{ |
44
|
|
|
if ($determiner instanceof StatusDeterminerInterface) { |
45
|
|
|
return $determiner->determineStatusCode($result); |
46
|
|
|
} |
47
|
|
|
if (is_callable($determiner)) { |
48
|
|
|
return $determiner($result); |
49
|
|
|
} |
50
|
|
|
} |
51
|
|
|
} |
52
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.