Passed
Branch main (7dca8f)
by Chema
03:15
created

Gacela::runPrePlugins()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 14
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 7
nc 3
nop 1
dl 0
loc 14
ccs 8
cts 8
cp 1
crap 3
rs 10
c 1
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Gacela\Framework;
6
7
use Closure;
8
use Gacela\Framework\Bootstrap\GacelaConfig;
9
use Gacela\Framework\Bootstrap\SetupGacela;
10
use Gacela\Framework\Bootstrap\SetupGacelaInterface;
11
use Gacela\Framework\ClassResolver\AbstractClassResolver;
12
use Gacela\Framework\ClassResolver\Cache\GacelaFileCache;
13
use Gacela\Framework\ClassResolver\Cache\InMemoryCache;
14
use Gacela\Framework\ClassResolver\ClassResolverCache;
15
use Gacela\Framework\ClassResolver\GlobalInstance\AnonymousGlobal;
16
use Gacela\Framework\Config\Config;
17
use Gacela\Framework\Config\ConfigFactory;
18
use Gacela\Framework\Container\Container;
19
use Gacela\Framework\Container\Locator;
20
use Gacela\Framework\DocBlockResolver\DocBlockResolverCache;
21
use Gacela\Framework\Plugin\PluginInterface;
22
23
final class Gacela
24
{
25
    /**
26
     * Define the entry point of Gacela.
27
     *
28
     * @param null|Closure(GacelaConfig):void $configFn
29
     */
30 83
    public static function bootstrap(string $appRootDir, Closure $configFn = null): void
31
    {
32 83
        $setup = self::processConfigFnIntoSetup($appRootDir, $configFn);
33
34 83
        if ($setup->shouldResetInMemoryCache()) {
35 45
            AbstractFacade::resetCache();
36 45
            AnonymousGlobal::resetCache();
37 45
            AbstractFactory::resetCache();
38 45
            GacelaFileCache::resetCache();
39 45
            DocBlockResolverCache::resetCache();
40 45
            ClassResolverCache::resetCache();
41 45
            InMemoryCache::resetCache();
42 45
            AbstractClassResolver::resetCache();
43 45
            ConfigFactory::resetCache();
44 45
            Config::resetInstance();
45
        }
46
47 83
        $config = Config::createWithSetup($setup);
48 83
        $config->setAppRootDir($appRootDir)
49 83
            ->init();
50
51 83
        self::runPrePlugins($config);
52
    }
53
54
    /**
55
     * @template T
56
     *
57
     * @param class-string<T> $className
0 ignored issues
show
Documentation Bug introduced by
The doc comment class-string<T> at position 0 could not be parsed: Unknown type name 'class-string' at position 0 in class-string<T>.
Loading history...
58
     *
59
     * @return T|null
60
     */
61
    public static function get(string $className): mixed
62
    {
63
        return Locator::getSingleton($className);
64
    }
65
66
    /**
67
     * @param null|Closure(GacelaConfig):void $configFn
68
     */
69 83
    private static function processConfigFnIntoSetup(string $appRootDir, Closure $configFn = null): SetupGacelaInterface
70
    {
71 83
        if ($configFn !== null) {
72 57
            return SetupGacela::fromCallable($configFn);
73
        }
74
75 26
        $gacelaFilePath = $appRootDir . '/gacela.php';
76
77 26
        if (is_file($gacelaFilePath)) {
78
            return SetupGacela::fromFile($gacelaFilePath);
79
        }
80
81 26
        return new SetupGacela();
82
    }
83
84 83
    private static function runPrePlugins(Config $config): void
85
    {
86 83
        $prePlugins = $config->getSetupGacela()->getPrePlugins();
87
88 83
        if ($prePlugins === []) {
89 82
            return;
90
        }
91
92 1
        $container = Container::withConfig($config);
93
94 1
        foreach ($prePlugins as $pluginName) {
95
            /** @var PluginInterface $plugin */
96 1
            $plugin = $container->get($pluginName);
97 1
            $plugin->run();
98
        }
99
    }
100
}
101