Completed
Push — master ( 40ecd1...8d3779 )
by Rémi
05:14
created

TwitterEventSerializer::serialize()   B

Complexity

Conditions 4
Paths 5

Size

Total Lines 22
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 14
CRAP Score 4

Importance

Changes 3
Bugs 1 Features 1
Metric Value
c 3
b 1
f 1
dl 0
loc 22
ccs 14
cts 14
cp 1
rs 8.9197
cc 4
eloc 12
nc 5
nop 1
crap 4
1
<?php
2
3
namespace Twitter\Serializer;
4
5
use Twitter\Object\TwitterDate;
6
use Twitter\Object\TwitterEvent;
7
use Twitter\TwitterSerializable;
8
use Twitter\TwitterSerializer;
9
10
class TwitterEventSerializer implements TwitterSerializer
11
{
12
    /**
13
     * @var TwitterUserSerializer
14
     */
15
    private $userSerializer;
16
17
    /**
18
     * @var TwitterEventTargetSerializer
19
     */
20
    private $targetSerializer;
21
22
    /**
23
     * @param TwitterUserSerializer $userSerializer
24
     * @param TwitterEventTargetSerializer $targetSerializer
25
     */
26 18
    public function __construct(TwitterUserSerializer $userSerializer, TwitterEventTargetSerializer $targetSerializer)
27
    {
28 18
        $this->userSerializer = $userSerializer;
29 18
        $this->targetSerializer = $targetSerializer;
30 18
    }
31
32
    /**
33
     * @param  TwitterSerializable $object
34
     * @return \stdClass
35
     */
36 6
    public function serialize(TwitterSerializable $object)
37
    {
38 6
        if (!$this->canSerialize($object)) {
39 3
            throw new \InvalidArgumentException('$object must be an instance of TwitterEvent');
40
        }
41
42
        /* @var TwitterEvent $object */
43 3
        $event = new \stdClass();
44 3
        $event->event = $object->getType();
45 3
        $event->source = $this->userSerializer->serialize($object->getSource());
46 3
        $event->created_at = $object->getDate()->setTimezone(new \DateTimeZone('UTC'))->format(TwitterDate::FORMAT);
47
48 3
        if ($object->getTarget()) {
49 3
            $event->target = $this->userSerializer->serialize($object->getTarget());
50 2
        }
51
52 3
        if ($object->getObject()) {
53 3
            $event->target_object = $this->targetSerializer->serialize($object->getObject());
54 2
        }
55
56 3
        return $event;
57
    }
58
59
    /**
60
     * @param  \stdClass $obj
61
     * @param  array     $context
62
     * @return TwitterEvent
63
     */
64 6
    public function unserialize($obj, array $context = [])
65
    {
66 6
        if (!$this->canUnserialize($obj)) {
67 3
            throw new \InvalidArgumentException('$object is not unserializable');
68
        }
69
70 3
        return TwitterEvent::create(
71 3
            $obj->event,
72 3
            $this->userSerializer->unserialize($obj->source),
73 3
            isset($obj->target) ? $this->userSerializer->unserialize($obj->target) : null,
74 3
            isset($obj->target_object) ? $this->targetSerializer->unserialize($obj->target_object) : null,
75 3
            new \DateTimeImmutable($obj->created_at)
76 2
        );
77
    }
78
79
    /**
80
     * @param  TwitterSerializable $object
81
     * @return boolean
82
     */
83 6
    public function canSerialize(TwitterSerializable $object)
84
    {
85 6
        return $object instanceof TwitterEvent;
86
    }
87
88
    /**
89
     * @param  \stdClass $object
90
     * @return boolean
91
     */
92 6
    public function canUnserialize($object)
93
    {
94 6
        return isset($object->event);
95
    }
96
97
    /**
98
     * @return TwitterEventSerializer
99
     */
100 6
    public static function build()
101
    {
102 6
        return new self(
103 6
            TwitterUserSerializer::build(),
104 6
            TwitterEventTargetSerializer::build()
105 4
        );
106
    }
107
}
108