Passed
Pull Request — master (#38)
by Nikolay
10:22
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\InvoiceNormalizer;
20
use TgBotApi\BotApiBase\Normalizer\JsonSerializableNormalizer;
21
use TgBotApi\BotApiBase\Normalizer\LegacyObjectNormalizerWrapper;
22
use TgBotApi\BotApiBase\Normalizer\MediaGroupNormalizer;
23
use TgBotApi\BotApiBase\Normalizer\PollNormalizer;
24
use TgBotApi\BotApiBase\Normalizer\SetMyCommandsNormalizer;
25
use TgBotApi\BotApiBase\Normalizer\UserProfilePhotosNormalizer;
26
27
/**
28
 * Class BotApiNormalizer.
29
 */
30
class BotApiNormalizer implements NormalizerInterface
31
{
32
    /**
33
     * @param $data
34
     * @param $type
35
     *
36
     * @throws ExceptionInterface
37
     *
38
     * @return object|array|bool
39
     */
40 156
    public function denormalize($data, $type)
41
    {
42 156
        $normalizer = new ObjectNormalizer(
43 156
            null,
44 156
            new CamelCaseToSnakeCaseNameConverter(),
45 156
            null,
46 156
            new PhpDocExtractor()
47
        );
48 156
        $arrayNormalizer = new ArrayDenormalizer();
49 156
        $dateNormalizer = new DateTimeNormalizer();
50 156
        $serializer = new Serializer([
51 156
            new UserProfilePhotosNormalizer($normalizer, $arrayNormalizer),
52 156
            new EditMessageResponseNormalizer($normalizer, $arrayNormalizer, $dateNormalizer),
53 156
            new DateTimeNormalizer(),
54 156
            $dateNormalizer,
55 156
            $normalizer,
56 156
            $arrayNormalizer,
57
        ]);
58
59 156
        return $serializer->denormalize($data, $type, null, [DateTimeNormalizer::FORMAT_KEY => 'U']);
60
    }
61
62
    /**
63
     * @param $method
64
     *
65
     * @throws ExceptionInterface
66
     */
67 309
    public function normalize($method): BotApiRequestInterface
68
    {
69 309
        $isLegacy = !\defined(AbstractObjectNormalizer::class . '::SKIP_NULL_VALUES');
70
71 309
        $files = [];
72
73 309
        $objectNormalizer = new ObjectNormalizer(null, new CamelCaseToSnakeCaseNameConverter());
74 309
        if ($isLegacy) {
75 103
            $objectNormalizer = new LegacyObjectNormalizerWrapper($objectNormalizer);
76
        }
77
78 309
        $serializer = new Serializer([
79 309
            new PollNormalizer($objectNormalizer),
80 309
            new InvoiceNormalizer($objectNormalizer),
81 309
            new SetMyCommandsNormalizer($objectNormalizer),
82 309
            new InputFileNormalizer($files),
83 309
            new MediaGroupNormalizer(new InputMediaNormalizer($objectNormalizer, $files), $objectNormalizer),
84 309
            new JsonSerializableNormalizer($objectNormalizer),
85 309
            new AnswerInlineQueryNormalizer($objectNormalizer),
86 309
            new DateTimeNormalizer(),
87 309
            $objectNormalizer,
88
        ]);
89
90 309
        $data = $serializer->normalize(
91 309
            $method,
92 309
            null,
93
            [
94 309
                'skip_null_values' => true,
95 309
                DateTimeNormalizer::FORMAT_KEY => 'U',
96
            ]
97
        );
98
99 309
        return new BotApiRequest($data, $files);
100
    }
101
}
102