Lines 100.00% 12 / 12
Methods 100.00% 4 / 4
Classes 100.00% 1 / 1
Name Lines Methods CRAP
 __construct 100.00% 1 / 1 100.00% 1 / 1 1
 handledMessageClass 100.00% 1 / 1 100.00% 1 / 1 1
 handle 100.00% 1 / 1 100.00% 1 / 1 1
 fireOnHomeAssistant 100.00% 9 / 9 100.00% 1 / 1 3
20final readonly class EventFireRequestHandler implements WorkerMessageHandler
21{
22    public function __construct(
23        private HaSession $session,
24        private HaClient $client,
25        private HaCallSlots $slots,
26        private ServiceCallPolicy $policy,
27        private LoggerInterface $logger,
28    ) {}
29
30    public function handledMessageClass(): string
31    {
32        return EventFireRequest::class;
33    }
34
35    /** @param EventFireRequest $message */
36    public function handle(WorkerHandle $handle, WorkerMessage $message): void
37    {
38        $this->slots->runBounded($handle, $message, fn(): EventFireResult => $this->fireOnHomeAssistant($message));
39    }
40
41    /** @throws EventFireException */
42    private function fireOnHomeAssistant(EventFireRequest $request): EventFireResult
43    {
44        if ($this->policy->dryRun) {
45            $this->logger->info('Event not fired: service_calls.dry_run is on', [
46                'event_type' => $request->eventType,
47                'data' => $request->data,
48            ]);
49
50            return new EventFireResult($request->correlationId, $this->policy->createDryRunContext($request->correlationId));
51        }
52
53        if (!$this->session->isConnected()) {
54            throw $request->createUnreachableFailure('Home Assistant is disconnected');
55        }
56
57        return new EventFireResult($request->correlationId, $this->client->fireEvent(new EventPayload($request->eventType, $request->data)));
58    }
59}