Passed
Push — master ( 388e91...bb0116 )
by Nikolay
04:57 queued 02:43
created

BotApiNormalizer::normalize()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 34
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 23
CRAP Score 2

Importance

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