Completed
Pull Request — master (#44)
by Nate
04:08 queued 02:15
created

CustomWrappedTypeAdapter::read()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 15
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

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