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

WildcardTypeAdapter   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 70
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 32
dl 0
loc 70
rs 10
c 0
b 0
f 0
wmc 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A write() 0 4 1
B read() 0 33 8
A __construct() 0 3 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;
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