Completed
Push — master ( dbc376...dd4c0c )
by Robert
06:26
created

JmsSerializer::assertClassMap()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 7
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 4
nc 3
nop 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Zored\Telegram\Serializer\Jms;
6
7
use JMS\Serializer\Naming\CamelCaseNamingStrategy;
8
use JMS\Serializer\SerializerBuilder;
9
use JMS\Serializer\SerializerInterface;
10
use Zored\Telegram\Serializer\Jms\Exception\JmsSerializerException;
11
use Zored\Telegram\Serializer\Jms\Visitor\ArrayDeserializationVisitor;
12
use Zored\Telegram\Serializer\Jms\Visitor\ArraySerializationVisitor;
13
use function is_object;
14
15
class JmsSerializer implements \Zored\Telegram\Serializer\SerializerInterface
16
{
17
    public const FORMAT_ARRAY = 'array';
18
19
    /**
20
     * @var SerializerInterface
21
     */
22
    private $serializer;
23
24
    /**
25
     * @var string[]
26
     */
27
    private $classMap;
28
29
    /**
30
     * @param string[] $classMap
31
     *
32
     * @throws JmsSerializerException
33
     */
34
    public function __construct(SerializerInterface $serializer = null, array $classMap = [])
35
    {
36
        $this->serializer = $serializer ?? $this->createDefaultSerializer();
37
        $this->classMap = $classMap;
38
        $this->assertClassMap();
39
    }
40
41
    /**
42
     * {@inheritdoc}
43
     */
44
    public function deserialize(string $class, array $data)
45
    {
46
        $class = $this->classMap[$class] ?? $class;
47
        $result = $this->serializer->deserialize($data, $class, self::FORMAT_ARRAY);
0 ignored issues
show
Bug introduced by
$data of type array is incompatible with the type string expected by parameter $data of JMS\Serializer\SerializerInterface::deserialize(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

47
        $result = $this->serializer->deserialize(/** @scrutinizer ignore-type */ $data, $class, self::FORMAT_ARRAY);
Loading history...
48
        if (!is_object($result)) {
49
            throw JmsSerializerException::becauseNotObjectReturned($result);
50
        }
51
52
        return $result;
53
    }
54
55
    public function serialize($object): array
56
    {
57
        return (array) $this->serializer->serialize($object, self::FORMAT_ARRAY);
58
    }
59
60
    private function createDefaultSerializer(): SerializerInterface
61
    {
62
        $builder = SerializerBuilder::create();
63
64
        $builder->addDefaultDeserializationVisitors();
65
        $builder->addDefaultSerializationVisitors();
66
        $namingStrategy = new CamelCaseNamingStrategy();
67
        $builder->setDeserializationVisitor(self::FORMAT_ARRAY, new ArrayDeserializationVisitor($namingStrategy));
68
        $builder->setSerializationVisitor(self::FORMAT_ARRAY, new ArraySerializationVisitor($namingStrategy));
69
70
        return $builder->build();
71
    }
72
73
    /**
74
     * @throws JmsSerializerException
75
     */
76
    private function assertClassMap(): void
77
    {
78
        foreach ($this->classMap as $before => $after) {
79
            if (is_subclass_of($after, $before)) {
80
                continue;
81
            }
82
            throw JmsSerializerException::becauseOfWrongMapping($before, $after);
83
        }
84
    }
85
}
86