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

WildcardTypeAdapter::read()   B

Complexity

Conditions 8
Paths 8

Size

Total Lines 33
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 27
CRAP Score 8

Importance

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