Passed
Pull Request — master (#28)
by Nikolay
03:06
created

BotApiNormalizer   A

Complexity

Total Complexity 3

Size/Duplication

Total Lines 69
Duplicated Lines 0 %

Test Coverage

Coverage 97.3%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 3
eloc 36
c 1
b 0
f 0
dl 0
loc 69
ccs 36
cts 37
cp 0.973
rs 10

2 Methods

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