ClassNameFinder::findClassName()   A
last analyzed

Complexity

Conditions 6
Paths 6

Size

Total Lines 35
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 19
c 0
b 0
f 0
dl 0
loc 35
rs 9.0111
cc 6
nc 6
nop 2
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
     */
25
    public function __construct(
26
        private ClassValidatorInterface $classValidator,
27
        private array $finderRules,
28
        private CacheInterface $cache,
29
        private array $projectNamespaces,
30
    ) {
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
     */
38
    #[Override]
39
    public function findClassName(ClassInfo $classInfo, array $resolvableTypes): ?string
40
    {
41
        $cacheKey = $classInfo->getCacheKey();
42
43
        if ($this->cache->has($cacheKey)) {
44
            $cached = $this->cache->get($cacheKey);
45
            self::dispatchEvent(new ClassNameCachedFoundEvent($cacheKey, $cached));
46
47
            return $cached;
48
        }
49
50
        $projectNamespaces = $this->projectNamespaces;
51
        $projectNamespaces[] = $classInfo->getModuleNamespace();
52
53
        foreach ($projectNamespaces as $projectNamespace) {
54
            foreach ($this->finderRules as $finderRule) {
55
                foreach ($resolvableTypes as $resolvableType) {
56
                    $className = $finderRule->buildClassCandidate($projectNamespace, $resolvableType, $classInfo);
57
58
                    if ($this->classValidator->isClassNameValid($className)) {
59
                        $this->cache->put($cacheKey, $className);
60
                        self::dispatchEvent(new ClassNameValidCandidateFoundEvent($className));
61
62
                        return $className;
63
                    }
64
65
                    self::dispatchEvent(new ClassNameInvalidCandidateFoundEvent($className));
66
                }
67
            }
68
        }
69
70
        self::dispatchEvent(new ClassNameNotFoundEvent($classInfo, $resolvableTypes));
71
72
        return null;
73
    }
74
}
75