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 | ||
| 3 | declare(strict_types=1); | |
| 4 | ||
| 5 | namespace Stewart\Runtime\Kernel; | |
| 6 | ||
| 7 | use Composer\InstalledVersions; | |
| 8 | use Stewart\Runtime\Container\TypedContainer; | |
| 9 | use Symfony\Component\Config\FileLocator; | |
| 10 | use Symfony\Component\DependencyInjection\Compiler\PassConfig; | |
| 11 | use Symfony\Component\DependencyInjection\ContainerBuilder; | |
| 12 | use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; | |
| 13 | ||
| 14 | final 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 | } |