SourceRegistry.php•1.39 kB
<?php
declare(strict_types=1);
namespace Butschster\ContextGenerator\Source\Registry;
use Butschster\ContextGenerator\Application\Logger\LoggerPrefix;
use Butschster\ContextGenerator\Source\SourceInterface;
use Psr\Log\LoggerInterface;
/**
 * Registry for source factories
 */
final class SourceRegistry implements SourceRegistryInterface, SourceProviderInterface
{
    /**
     * @var array<string, SourceFactoryInterface>
     */
    private array $factories = [];
    public function __construct(
        #[LoggerPrefix(prefix: 'source-registry')]
        private readonly ?LoggerInterface $logger = null,
    ) {}
    public function register(SourceFactoryInterface $factory): self
    {
        $this->factories[$factory->getType()] = $factory;
        $this->logger?->debug(\sprintf('Registered source factory for type "%s"', $factory->getType()), [
            'factoryClass' => $factory::class,
        ]);
        return $this;
    }
    public function create(string $type, array $config): SourceInterface
    {
        if (!isset($this->factories[$type])) {
            throw new \RuntimeException(\sprintf('Source factory for type "%s" not found', $type));
        }
        $factory = $this->factories[$type];
        return $factory->create($config);
    }
    public function has(string $type): bool
    {
        return isset($this->factories[$type]);
    }
}