<?php
declare(strict_types=1);
namespace Slivki\Messenger\Query;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Messenger\Stamp\HandledStamp;
final class MessengerQueryBus implements QueryBusInterface
{
private MessageBusInterface $messageBus;
public function __construct(MessageBusInterface $messageBus)
{
$this->messageBus = $messageBus;
}
/**
* @return mixed
*/
public function handle(QueryInterface $query)
{
$envelope = $this->messageBus->dispatch($query);
/** @var HandledStamp[] $handledStamps */
$handledStamps = $envelope->all(HandledStamp::class);
$countOfHandledStamps = \count($handledStamps);
if ($countOfHandledStamps === 0) {
throw InvalidQueryHandlerCountException::zero($envelope);
}
if ($countOfHandledStamps > 1) {
$handlerNames = \array_map(
static fn (HandledStamp $stamp): string => \sprintf('"%s"', $stamp->getHandlerName()),
$handledStamps,
);
throw InvalidQueryHandlerCountException::moreThanOne($envelope, $countOfHandledStamps, $handlerNames);
}
return $handledStamps[0]->getResult();
}
}