Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
94.44% covered (success)
94.44%
17 / 18
66.67% covered (warning)
66.67%
2 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
EncoderHashmap
94.44% covered (success)
94.44%
17 / 18
66.67% covered (warning)
66.67%
2 / 3
11.02
0.00% covered (danger)
0.00%
0 / 1
 offsetGet
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 create
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getAcceptedContentTypeForRequest
93.75% covered (success)
93.75%
15 / 16
0.00% covered (danger)
0.00%
0 / 1
9.02
1<?php
2namespace Apie\Serializer;
3
4use Apie\Core\Lists\ItemHashmap;
5use Apie\Serializer\Encoders\JsonEncoder;
6use Apie\Serializer\Exceptions\NotAcceptedException;
7use Apie\Serializer\Interfaces\EncoderInterface;
8use LogicException;
9use Psr\Http\Message\RequestInterface;
10use Symfony\Component\HttpFoundation\AcceptHeader;
11
12final class EncoderHashmap extends ItemHashmap
13{
14    protected bool $mutable = false;
15
16    public function offsetGet(mixed $offset): EncoderInterface
17    {
18        return parent::offsetGet($offset);
19    }
20
21    public static function create(): self
22    {
23        return new self(['application/json' => new JsonEncoder()]);
24    }
25
26    public function getAcceptedContentTypeForRequest(RequestInterface $request, ?string $fallback = null): string
27    {
28        if (empty($this->internalArray) && $fallback === null) {
29            throw new LogicException('I am an encoder hashmap with no encoders?');
30        }
31    
32        if (!$request->hasHeader('Accept')) {
33            reset($this->internalArray);
34            return key($this->internalArray);
35        }
36        $acceptString = $request->getHeaderLine('Accept');
37        $acceptHeaders = AcceptHeader::fromString($acceptString);
38        foreach ($this as $mimeType => $_encoder) {
39            if ($item = $acceptHeaders->get($mimeType)) {
40                return $mimeType;
41            }
42        }
43        if (strtolower($request->getMethod()) === 'delete') {
44            reset($this->internalArray);
45            return key($this->internalArray) ? : 'application/json';
46        }
47
48        if ($fallback === null) {
49            throw new NotAcceptedException($acceptString);
50        }
51        return $fallback;
52    }
53}