Lines 94.11% 16 / 17
Functions and Methods 50.00% 1 / 2
Classes and Traits 0.00% 0 / 1
Name Lines Functions and Methods CRAP Classes and Traits
ProfileCompiler 94.11% 16 / 17 50.00% 1 / 2 7.01 0.00% 0 / 1
 compileProfileContainer 100.00% 13 / 13 100.00% 1 / 1 4
 configFileOfInstalledPackage 75.00% 3 / 4 0.00% 0 / 1 3.14
1<?php
2
3declare(strict_types=1);
4
5namespace Stewart\Runtime\Kernel;
6
7use Composer\InstalledVersions;
8use Stewart\Runtime\Container\TypedContainer;
9use Symfony\Component\Config\FileLocator;
10use Symfony\Component\DependencyInjection\Compiler\PassConfig;
11use Symfony\Component\DependencyInjection\ContainerBuilder;
12use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
13
14final readonly class ProfileCompiler
15{
16    private const string CONFIG_DIRECTORY = __DIR__ . '/../../config';
17
18    private const string PACKAGE_CONFIG = '/config/services.php';
19
20    public function compileProfileContainer(ContainerProfile $profile, SyntheticServices $services, NamedArguments $arguments = new NamedArguments()): TypedContainer
21    {
22        $builder = new ContainerBuilder();
23        $loader = new PhpFileLoader($builder, new FileLocator(self::CONFIG_DIRECTORY));
24
25        foreach ($profile->configFiles() as $file) {
26            $loader->load($file);
27        }
28
29        foreach ($profile->optionalPackages() as $package) {
30            $config = $this->configFileOfInstalledPackage($package);
31
32            if ($config !== null) {
33                $loader->load($config);
34            }
35        }
36
37        $services->declareDefinitionsOn($builder);
38        $builder->addCompilerPass(new NamedArgumentsPass($arguments), PassConfig::TYPE_BEFORE_OPTIMIZATION);
39        $builder->compile();
40        $services->setInstancesOn($builder);
41
42        return new TypedContainer($builder);
43    }
44
45    private function configFileOfInstalledPackage(string $package): ?string
46    {
47        if (!InstalledVersions::isInstalled($package)) {
48            return null;
49        }
50
51        $config = InstalledVersions::getInstallPath($package) . self::PACKAGE_CONFIG;
52
53        return is_file($config) ? $config : null;
54    }
55}