Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
80.00% covered (warning)
80.00%
12 / 15
50.00% covered (danger)
50.00%
2 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
PanelRenderer
80.00% covered (warning)
80.00%
12 / 15
50.00% covered (danger)
50.00%
2 / 4
7.39
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 handle
71.43% covered (warning)
71.43%
5 / 7
0.00% covered (danger)
0.00%
0 / 1
4.37
 replace
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 response
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3declare(strict_types=1);
4
5namespace Cosray;
6
7use Celemas\Core\Factory\Factory;
8use Celemas\Core\Response;
9use Celemas\Router\After;
10use Override;
11use Psr\Http\Message\ResponseInterface as PsrResponse;
12use Traversable;
13
14/** @psalm-api */
15final class PanelRenderer implements AfterRenderer
16{
17    public function __construct(
18        private Renderer $renderer,
19        private Factory $factory,
20        private string $template,
21    ) {}
22
23    #[Override]
24    public function handle(mixed $data): PsrResponse
25    {
26        if ($data instanceof PsrResponse) {
27            return $data;
28        }
29
30        if ($data instanceof Response) {
31            return $data->unwrap();
32        }
33
34        if ($data instanceof Traversable) {
35            return $this->response(iterator_to_array($data));
36        }
37
38        return $this->response($data);
39    }
40
41    #[Override]
42    public function replace(After $handler): bool
43    {
44        return is_a($handler, Renderer::class);
45    }
46
47    private function response(array $context): PsrResponse
48    {
49        $html = $this->renderer->render($this->template, $context);
50
51        $response = $this->factory
52            ->response()
53            ->withHeader('Content-Type', 'text/html');
54        $response->getBody()->write($html);
55
56        return $response;
57    }
58}