Lines 80.95% 17 / 21
Methods 83.33% 5 / 6
Classes 0.00% 0 / 1
Name Lines Methods CRAP
 __construct 100.00% 1 / 1 100.00% 1 / 1 1
 forwardExpose 100.00% 6 / 6 100.00% 1 / 1 1
 forwardReconfigure 100.00% 5 / 5 100.00% 1 / 1 1
 forwardUpdate 100.00% 4 / 4 100.00% 1 / 1 1
 forwardRemove 0.00% 0 / 4 0.00% 0 / 1 2
 requireAppId 100.00% 1 / 1 100.00% 1 / 1 1
21final readonly class ExposureProxy
22{
23    public function __construct(
24        private ExposureLink $exposures,
25        private HaCallSlots $slots,
26    ) {}
27
28    public function forwardExpose(WorkerHandle $handle, ExposeEntityRequest $request): void
29    {
30        $this->slots->runCounted($handle, $request, function () use ($handle, $request): ExposeEntityResult {
31            $appId = $this->requireAppId($request->scope, $request->key);
32            $definition = ExposedEntityDefinition::fromConfig($request->config, $request->device);
33            $snapshot = $this->exposures->exposeEntity($handle->id, $appId, $request->key, $definition, $request->change);
34
35            return new ExposeEntityResult($request->correlationId, $snapshot);
36        });
37    }
38
39    public function forwardReconfigure(WorkerHandle $handle, ReconfigureExposedEntityRequest $request): void
40    {
41        $this->slots->runCounted($handle, $request, function () use ($request): ExposeEntityResult {
42            $appId = $this->requireAppId($request->scope, $request->key);
43            $snapshot = $this->exposures->reconfigureEntity($appId, $request->key, ExposedEntityDefinition::fromConfig($request->config, null));
44
45            return new ExposeEntityResult($request->correlationId, $snapshot);
46        });
47    }
48
49    public function forwardUpdate(WorkerHandle $handle, UpdateExposedEntityRequest $request): void
50    {
51        $this->slots->runCounted($handle, $request, function () use ($request): ExposureAcknowledged {
52            $this->exposures->updateEntity($this->requireAppId($request->scope, $request->key), $request->key, $request->change);
53
54            return new ExposureAcknowledged($request->correlationId);
55        });
56    }
57
58    public function forwardRemove(WorkerHandle $handle, RemoveExposedEntityRequest $request): void
59    {
60        $this->slots->runCounted($handle, $request, function () use ($request): ExposureAcknowledged {
61            $this->exposures->removeEntity($this->requireAppId($request->scope, $request->key), $request->key);
62
63            return new ExposureAcknowledged($request->correlationId);
64        });
65    }
66
67    /** @throws ExposureException */
68    private function requireAppId(ResourceScope $scope, ExposedEntityKey $key): AppId
69    {
70        return $scope->appId ?? throw ExposureException::outsideApp($key);
71    }
72}