Lines 94.11% 16 / 17
Methods 50.00% 1 / 2
Classes 0.00% 0 / 1
Name Lines Methods CRAP
 compileProfileContainer 100.00% 13 / 13 100.00% 1 / 1 4
 configFileOfInstalledPackage 75.00% 3 / 4 0.00% 0 / 1 3.14
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}