Passed
Pull Request — master (#8)
by Nikolay
02:45
created

BotApiNormalizer::denormalize()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 20
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 15
c 1
b 0
f 0
dl 0
loc 20
ccs 16
cts 16
cp 1
rs 9.7666
cc 1
nc 1
nop 2
crap 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace TgBotApi\BotApiBase;
6
7
use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor;
8
use Symfony\Component\Serializer\Exception\ExceptionInterface;
9
use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;
10
use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
11
use Symfony\Component\Serializer\Normalizer\ArrayDenormalizer;
12
use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer;
13
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
14
use Symfony\Component\Serializer\Serializer;
15
use TgBotApi\BotApiBase\Normalizer\AnswerInlineQueryNormalizer;
16
use TgBotApi\BotApiBase\Normalizer\EditMessageResponseNormalizer;
17
use TgBotApi\BotApiBase\Normalizer\InputFileNormalizer;
18
use TgBotApi\BotApiBase\Normalizer\InputMediaNormalizer;
19
use TgBotApi\BotApiBase\Normalizer\JsonSerializableNormalizer;
20
use TgBotApi\BotApiBase\Normalizer\MediaGroupNormalizer;
21
use TgBotApi\BotApiBase\Normalizer\UserProfilePhotosNormalizer;
22
23
/**
24
 * Class BotApiNormalizer.
25
 */
26
class BotApiNormalizer implements NormalizerInterface
27
{
28
    /**
29
     * @param $data
30
     * @param $type
31
     *
32
     * @throws ExceptionInterface
33
     *
34
     * @return object|array|bool
35
     */
36 144
    public function denormalize($data, $type)
37
    {
38 144
        $normalizer = new ObjectNormalizer(
39 144
            null,
40 144
            new CamelCaseToSnakeCaseNameConverter(),
41 144
            null,
42 144
            new PhpDocExtractor()
43
        );
44 144
        $arrayNormalizer = new ArrayDenormalizer();
45 144
        $dateNormalizer = new DateTimeNormalizer();
46 144
        $serializer = new Serializer([
47 144
            new UserProfilePhotosNormalizer($normalizer, $arrayNormalizer),
48 144
            new EditMessageResponseNormalizer($normalizer, $arrayNormalizer, $dateNormalizer),
49 144
            new DateTimeNormalizer(),
50 144
            $dateNormalizer,
51 144
            $normalizer,
52 144
            $arrayNormalizer,
53
        ]);
54
55 144
        return $serializer->denormalize($data, $type, null, [DateTimeNormalizer::FORMAT_KEY => 'U']);
56
    }
57
58
    /**
59
     * @param $method
60
     *
61
     * @throws ExceptionInterface
62
     */
63 188
    public function normalize($method): BotApiRequestInterface
64
    {
65 188
        if (!\defined(AbstractObjectNormalizer::class . '::SKIP_NULL_VALUES')) {
66
            $message = 'Please use BotApiLegacyNormalizer class as normalizer.'
67
                . ' BotApiNormalizer is not supported Symfony serializer <= 4.3';
68
            throw new \RuntimeException($message);
69
        }
70
71 188
        $files = [];
72
73 188
        $objectNormalizer = new ObjectNormalizer(null, new CamelCaseToSnakeCaseNameConverter());
74 188
        $serializer = new Serializer([
75 188
            new InputFileNormalizer($files),
76 188
            new MediaGroupNormalizer(new InputMediaNormalizer($objectNormalizer, $files), $objectNormalizer),
77 188
            new JsonSerializableNormalizer($objectNormalizer),
78 188
            new AnswerInlineQueryNormalizer($objectNormalizer),
79 188
            new DateTimeNormalizer(),
80 188
            $objectNormalizer,
81
        ]);
82
83 188
        $data = $serializer->normalize(
84 188
            $method,
85 188
            null,
86 188
            [AbstractObjectNormalizer::SKIP_NULL_VALUES => true, DateTimeNormalizer::FORMAT_KEY => 'U']
87
        );
88
89 188
        return new BotApiRequest($data, $files);
90
    }
91
}
92