Lines 93.33% 14 / 15
Methods 85.71% 6 / 7
Classes 0.00% 0 / 1
Name Lines Methods CRAP
 __construct 100.00% 1 / 1 100.00% 1 / 1 1
 open 100.00% 3 / 3 100.00% 1 / 1 1
 resolve 100.00% 1 / 1 100.00% 1 / 1 1
 rejectFromWire 100.00% 1 / 1 100.00% 1 / 1 1
 forget 0.00% 0 / 1 0.00% 0 / 1 2
 failAll 100.00% 5 / 5 100.00% 1 / 1 2
 take 100.00% 3 / 3 100.00% 1 / 1 1
13final class PendingRequests
14{
15    /** @var array<string, PendingRequest<object>> */
16    private array $pending = [];
17
18    public function __construct(private readonly CorrelationIdSequence $correlationIds) {}
19
20    /**
21     * @template TResult of object
22     *
23     * @param class-string<TResult> $resultClass
24     * @param Closure(string): StewartException<ExceptionReason> $unreachable
25     * @return PendingRequest<TResult>
26     */
27    public function open(string $resultClass, Closure $unreachable): PendingRequest
28    {
29        $request = new PendingRequest($this->correlationIds->issueNext(), $resultClass, $unreachable);
30        $this->pending[$request->correlationId->value] = $request;
31
32        return $request;
33    }
34
35    public function resolve(CorrelationId $correlationId, object $result): void
36    {
37        $this->take($correlationId)?->complete($result);
38    }
39
40    public function rejectFromWire(RequestFailed $failure): void
41    {
42        $this->take($failure->correlationId)?->failFromWire($failure);
43    }
44
45    public function forget(CorrelationId $correlationId): void
46    {
47        unset($this->pending[$correlationId->value]);
48    }
49
50    public function failAll(string $detail): int
51    {
52        $pending = $this->pending;
53        $this->pending = [];
54
55        foreach ($pending as $request) {
56            $request->failAsUnreachable($detail);
57        }
58
59        return \count($pending);
60    }
61
62    /** @return PendingRequest<object>|null */
63    private function take(CorrelationId $correlationId): ?PendingRequest
64    {
65        $request = $this->pending[$correlationId->value] ?? null;
66        unset($this->pending[$correlationId->value]);
67
68        return $request;
69    }
70}