Test Failed
Push — master ( d641b2...b856ab )
by Jan
03:23
created

PayloadGenerator::generate()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
c 0
b 0
f 0
dl 0
loc 7
rs 10
cc 1
nc 1
nop 1
1
<?php
2
declare(strict_types=1);
3
4
namespace DiscordWebhook\Generator;
5
6
use DateTime;
7
use Symfony\Component\Serializer\Encoder\JsonEncoder;
8
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
9
use Symfony\Component\Serializer\Mapping\Loader\YamlFileLoader;
10
use Symfony\Component\Serializer\NameConverter\MetadataAwareNameConverter;
11
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
12
use Symfony\Component\Serializer\Serializer;
13
14
/**
15
 * Class PayloadGenerator
16
 *
17
 * @package DiscordWebhook\Generator
18
 * @author Scrummer <[email protected]>
19
 */
20
class PayloadGenerator
21
{
22
    /**
23
     * @var Serializer
24
     */
25
    private $serializer;
26
27
    public function __construct()
28
    {
29
        $classMetadataFactory = new ClassMetadataFactory(new YamlFileLoader(__DIR__ . '/../../config/serializer/definition.yml'));
30
        $metadataAwareNameConverter = new MetadataAwareNameConverter($classMetadataFactory);
31
        $defaultContext = [
32
            ObjectNormalizer::CALLBACKS => [
33
                'timestamp' => [$this, 'formatTimestamp']
34
            ],
35
            ObjectNormalizer::SKIP_NULL_VALUES => true
36
        ];
37
38
        $normalizer = new ObjectNormalizer(
39
            $classMetadataFactory,
40
            $metadataAwareNameConverter,
41
            null,
42
            null,
43
            null,
44
            null,
45
            $defaultContext
46
        );
47
48
        $this->serializer = new Serializer([$normalizer], [new JsonEncoder()]);
49
    }
50
51
    public function generate(object $object): array
52
    {
53
        return $this->serializer->normalize(
54
            $object,
55
            null,
56
            [
57
                'groups' => ['discord']
58
            ]
59
        );
60
    }
61
62
    public function formatTimestamp($dateTime): ?string
63
    {
64
        return $dateTime instanceof DateTime ? $dateTime->format(DateTime::ATOM) : null;
65
    }
66
}
67