ClassNameFinder   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 56
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 7
eloc 21
c 0
b 0
f 0
dl 0
loc 56
ccs 21
cts 21
cp 1
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A findClassName() 0 35 6
A __construct() 0 6 1
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
use Override;
16
17
final class ClassNameFinder implements ClassNameFinderInterface
18
{
19
    use EventDispatchingCapabilities;
20
21
    /**
22
     * @param list<FinderRuleInterface> $finderRules
23
     * @param list<string> $projectNamespaces
24 49
     */
25
    public function __construct(
26
        private ClassValidatorInterface $classValidator,
27
        private array $finderRules,
28
        private CacheInterface $cache,
29
        private array $projectNamespaces,
30 49
    ) {
31
    }
32
33
    /**
34
     * @param list<string> $resolvableTypes
35
     *
36
     * @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...
37 68
     */
38
    #[Override]
39 68
    public function findClassName(ClassInfo $classInfo, array $resolvableTypes): ?string
40
    {
41 68
        $cacheKey = $classInfo->getCacheKey();
42 2
43 2
        if ($this->cache->has($cacheKey)) {
44
            $cached = $this->cache->get($cacheKey);
45 2
            self::dispatchEvent(new ClassNameCachedFoundEvent($cacheKey, $cached));
46
47 67
            return $cached;
48 67
        }
49
50 67
        $projectNamespaces = $this->projectNamespaces;
51 67
        $projectNamespaces[] = $classInfo->getModuleNamespace();
52 66
53 65
        foreach ($projectNamespaces as $projectNamespace) {
54
            foreach ($this->finderRules as $finderRule) {
55 65
                foreach ($resolvableTypes as $resolvableType) {
56 57
                    $className = $finderRule->buildClassCandidate($projectNamespace, $resolvableType, $classInfo);
57 57
58
                    if ($this->classValidator->isClassNameValid($className)) {
59 57
                        $this->cache->put($cacheKey, $className);
60
                        self::dispatchEvent(new ClassNameValidCandidateFoundEvent($className));
61
62 57
                        return $className;
63
                    }
64
65
                    self::dispatchEvent(new ClassNameInvalidCandidateFoundEvent($className));
66
                }
67 17
            }
68
        }
69 17
70
        self::dispatchEvent(new ClassNameNotFoundEvent($classInfo, $resolvableTypes));
71
72
        return null;
73
    }
74
}
75