Completed
Pull Request — master (#44)
by Nate
05:11 queued 02:28
created

CustomWrappedTypeAdapter   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 112
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 34
dl 0
loc 112
ccs 31
cts 31
cp 1
rs 10
c 0
b 0
f 0
wmc 6

3 Methods

Rating   Name   Duplication   Size   Complexity  
A read() 0 15 2
A write() 0 24 3
A __construct() 0 12 1
1
<?php
2
/*
3
 * Copyright (c) Nate Brunette.
4
 * Distributed under the MIT License (http://opensource.org/licenses/MIT)
5
 */
6
7
declare(strict_types=1);
8
9
namespace Tebru\Gson\TypeAdapter;
10
11
use Tebru\Gson\Internal\DefaultJsonDeserializationContext;
12
use Tebru\Gson\Internal\DefaultJsonSerializationContext;
13
use Tebru\Gson\Internal\TypeAdapterProvider;
14
use Tebru\Gson\JsonDeserializer;
15
use Tebru\Gson\JsonReadable;
16
use Tebru\Gson\JsonSerializer;
17
use Tebru\Gson\JsonWritable;
18
use Tebru\Gson\TypeAdapter;
19
use Tebru\Gson\TypeAdapterFactory;
20
use Tebru\PhpType\TypeToken;
21
22
/**
23
 * Class CustomWrappedTypeAdapter
24
 *
25
 * Wraps a [@see JsonSerializer] or [@see JsonDeserializer] and delegates if either is null
26
 *
27
 * @author Nate Brunette <[email protected]>
28
 */
29
class CustomWrappedTypeAdapter extends TypeAdapter
30
{
31
    /**
32
     * @var TypeToken
33
     */
34
    private $type;
35
36
    /**
37
     * @var TypeAdapterProvider
38
     */
39
    private $typeAdapterProvider;
40
41
    /**
42
     * @var JsonSerializer
43
     */
44
    private $serializer;
45
46
    /**
47
     * @var JsonDeserializer
48
     */
49
    private $deserializer;
50
51
    /**
52
     * @var TypeAdapterFactory
53
     */
54
    private $skip;
55
56
    /**
57
     * Cached instance of the delegate type adapter
58
     *
59
     * @var TypeAdapter
60
     */
61
    private $delegateTypeAdapter;
62
63
    /**
64
     * Constructor
65
     *
66
     * @param TypeToken $type
67
     * @param TypeAdapterProvider $typeAdapterProvider
68
     * @param JsonSerializer|null $serializer
69
     * @param JsonDeserializer|null $deserializer
70
     * @param TypeAdapterFactory|null $skip
71
     */
72 8
    public function __construct(
73
        TypeToken $type,
74
        TypeAdapterProvider $typeAdapterProvider,
75
        JsonSerializer $serializer = null,
76
        JsonDeserializer $deserializer = null,
77
        TypeAdapterFactory $skip = null
78
    ) {
79 8
        $this->type = $type;
80 8
        $this->typeAdapterProvider = $typeAdapterProvider;
81 8
        $this->serializer = $serializer;
82 8
        $this->deserializer = $deserializer;
83 8
        $this->skip = $skip;
84 8
    }
85
86
    /**
87
     * Read the next value, convert it to its type and return it
88
     *
89
     * @param JsonReadable $reader
90
     * @return mixed
91
     */
92 5
    public function read(JsonReadable $reader)
93
    {
94 5
        if (null === $this->deserializer) {
95 1
            $this->delegateTypeAdapter = $this->delegateTypeAdapter ?? $this->typeAdapterProvider->getAdapter($this->type, $this->skip);
96
97 1
            return $this->delegateTypeAdapter->read($reader);
98
        }
99
100 4
        $jsonElementTypeAdapter = new JsonElementTypeAdapter();
101 4
        $jsonElement = $jsonElementTypeAdapter->read($reader);
102
103 4
        return $this->deserializer->deserialize(
104 4
            $jsonElement,
105 4
            $this->type,
106 4
            new DefaultJsonDeserializationContext($this->typeAdapterProvider, $reader->getContext())
107
        );
108
    }
109
110
    /**
111
     * Write the value to the writer for the type
112
     *
113
     * @param JsonWritable $writer
114
     * @param mixed $value
115
     * @return void
116
     */
117 3
    public function write(JsonWritable $writer, $value): void
118
    {
119 3
        if (null === $this->serializer) {
120 1
            $this->delegateTypeAdapter = $this->delegateTypeAdapter ?? $this->typeAdapterProvider->getAdapter($this->type, $this->skip);
121
122 1
            $this->delegateTypeAdapter->write($writer, $value);
123
124 1
            return;
125
        }
126
127 2
        if (null === $value) {
128 1
            $writer->writeNull();
129
130 1
            return;
131
        }
132
133 1
        $jsonElement = $this->serializer->serialize(
134 1
            $value,
135 1
            $this->type,
136 1
            new DefaultJsonSerializationContext($this->typeAdapterProvider, $writer->isSerializeNull())
137
        );
138
139 1
        $jsonElementTypeAdapter = new JsonElementTypeAdapter();
140 1
        $jsonElementTypeAdapter->write($writer, $jsonElement);
141 1
    }
142
}
143