ClassNameFinder::findClassName()   A
last analyzed

Complexity

Conditions 6
Paths 6

Size

Total Lines 34
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 19
CRAP Score 6

Importance

Changes 0
Metric Value
eloc 18
dl 0
loc 34
ccs 19
cts 19
cp 1
rs 9.0444
c 0
b 0
f 0
cc 6
nc 6
nop 2
crap 6
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Gacela\Framework\ClassResolver\ClassNameFinder;
6
7
use Gacela\Framework\ClassResolver\Cache\CacheInterface;
8
use Gacela\Framework\ClassResolver\ClassInfo;
9
use Gacela\Framework\ClassResolver\ClassNameFinder\Rule\FinderRuleInterface;
10
use Gacela\Framework\Event\ClassResolver\ClassNameFinder\ClassNameCachedFoundEvent;
11
use Gacela\Framework\Event\ClassResolver\ClassNameFinder\ClassNameInvalidCandidateFoundEvent;
12
use Gacela\Framework\Event\ClassResolver\ClassNameFinder\ClassNameNotFoundEvent;
13
use Gacela\Framework\Event\ClassResolver\ClassNameFinder\ClassNameValidCandidateFoundEvent;
14
use Gacela\Framework\Event\Dispatcher\EventDispatchingCapabilities;
15
16
final class ClassNameFinder implements ClassNameFinderInterface
17
{
18
    use EventDispatchingCapabilities;
19
20
    /**
21
     * @param list<FinderRuleInterface> $finderRules
22
     * @param list<string> $projectNamespaces
23
     */
24 49
    public function __construct(
25
        private ClassValidatorInterface $classValidator,
26
        private array $finderRules,
27
        private CacheInterface $cache,
28
        private array $projectNamespaces,
29
    ) {
30 49
    }
31
32
    /**
33
     * @param list<string> $resolvableTypes
34
     *
35
     * @return class-string|null
0 ignored issues
show
Documentation Bug introduced by
The doc comment class-string|null at position 0 could not be parsed: Unknown type name 'class-string' at position 0 in class-string|null.
Loading history...
36
     */
37 68
    public function findClassName(ClassInfo $classInfo, array $resolvableTypes): ?string
38
    {
39 68
        $cacheKey = $classInfo->getCacheKey();
40
41 68
        if ($this->cache->has($cacheKey)) {
42 2
            $cached = $this->cache->get($cacheKey);
43 2
            self::dispatchEvent(new ClassNameCachedFoundEvent($cacheKey, $cached));
44
45 2
            return $cached;
46
        }
47 67
48 67
        $projectNamespaces = $this->projectNamespaces;
49
        $projectNamespaces[] = $classInfo->getModuleNamespace();
50 67
51 67
        foreach ($projectNamespaces as $projectNamespace) {
52 66
            foreach ($this->finderRules as $finderRule) {
53 65
                foreach ($resolvableTypes as $resolvableType) {
54
                    $className = $finderRule->buildClassCandidate($projectNamespace, $resolvableType, $classInfo);
55 65
56 57
                    if ($this->classValidator->isClassNameValid($className)) {
57 57
                        $this->cache->put($cacheKey, $className);
58
                        self::dispatchEvent(new ClassNameValidCandidateFoundEvent($className));
59 57
60
                        return $className;
61
                    }
62 57
63
                    self::dispatchEvent(new ClassNameInvalidCandidateFoundEvent($className));
64
                }
65
            }
66
        }
67 17
68
        self::dispatchEvent(new ClassNameNotFoundEvent($classInfo, $resolvableTypes));
69 17
70
        return null;
71
    }
72
}
73