Completed
Pull Request — master (#44)
by Nate
04:05 queued 01:55
created

WildcardTypeAdapter::read()   B

Complexity

Conditions 8
Paths 8

Size

Total Lines 33
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 8
eloc 27
nc 8
nop 1
dl 0
loc 33
rs 8.4444
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\Exception\JsonSyntaxException;
12
use Tebru\Gson\Internal\TypeAdapterProvider;
13
use Tebru\PhpType\TypeToken;
14
15
/**
16
 * Class WildcardTypeAdapter
17
 *
18
 * @author Nate Brunette <[email protected]>
19
 */
20
class WildcardTypeAdapter extends TypeAdapter
21
{
22
    /**
23
     * @var TypeAdapterProvider
24
     */
25
    private $typeAdapterProvider;
26
27
    /**
28
     * Constructor
29
     *
30
     * @param TypeAdapterProvider $typeAdapterProvider
31
     */
32
    public function __construct(TypeAdapterProvider $typeAdapterProvider)
33
    {
34
        $this->typeAdapterProvider = $typeAdapterProvider;
35
    }
36
37
    /**
38
     * Read the next value, convert it to its type and return it
39
     *
40
     * @param JsonReadable $reader
41
     * @return mixed
42
     * @throws \Tebru\Gson\Exception\JsonSyntaxException If the token can't be processed
43
     */
44
    public function read(JsonReadable $reader)
45
    {
46
        switch ($reader->peek()) {
47
            case JsonToken::BEGIN_ARRAY:
48
                $type = TypeToken::create(TypeToken::HASH);
49
                break;
50
            case JsonToken::BEGIN_OBJECT:
51
                $type = TypeToken::create(TypeToken::OBJECT);
52
                break;
53
            case JsonToken::STRING:
54
            case JsonToken::NAME:
55
                $type = TypeToken::create(TypeToken::STRING);
56
                break;
57
            case JsonToken::BOOLEAN:
58
                $type = TypeToken::create(TypeToken::BOOLEAN);
59
                break;
60
            case JsonToken::NUMBER:
61
                $type = TypeToken::create(TypeToken::FLOAT);
62
                break;
63
            case JsonToken::NULL:
64
                $type = TypeToken::create(TypeToken::NULL);
65
                break;
66
            default:
67
                throw new JsonSyntaxException(
68
                    \sprintf(
69
                        'Could not parse token "%s" at "%s"',
70
                        $reader->peek(),
71
                        $reader->getPath()
72
                    )
73
                );
74
        }
75
76
        return $this->typeAdapterProvider->getAdapter($type)->read($reader);
77
    }
78
79
    /**
80
     * Write the value to the writer for the type
81
     *
82
     * @param JsonWritable $writer
83
     * @param mixed $value
84
     * @return void
85
     */
86
    public function write(JsonWritable $writer, $value): void
87
    {
88
        $adapter = $this->typeAdapterProvider->getAdapter(TypeToken::createFromVariable($value));
89
        $adapter->write($writer, $value);
90
    }
91
}
92