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

WildcardTypeAdapter::read()   B

Complexity

Conditions 8
Paths 8

Size

Total Lines 33
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 26
CRAP Score 8

Importance

Changes 0
Metric Value
cc 8
eloc 27
nc 8
nop 1
dl 0
loc 33
ccs 26
cts 26
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;
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 18
37
    /**
38 18
     * Read the next value, convert it to its type and return it
39 18
     *
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 10
                $type = TypeToken::create(TypeToken::HASH);
49
                break;
50 10
            case JsonToken::BEGIN_OBJECT:
51 10
                $type = TypeToken::create(TypeToken::OBJECT);
52 1
                break;
53 1
            case JsonToken::STRING:
54 9
            case JsonToken::NAME:
55 1
                $type = TypeToken::create(TypeToken::STRING);
56 1
                break;
57 8
            case JsonToken::BOOLEAN:
58 7
                $type = TypeToken::create(TypeToken::BOOLEAN);
59 2
                break;
60 2
            case JsonToken::NUMBER:
61 6
                $type = TypeToken::create(TypeToken::FLOAT);
62 2
                break;
63 2
            case JsonToken::NULL:
64 4
                $type = TypeToken::create(TypeToken::NULL);
65 2
                break;
66 2
            default:
67 2
                throw new JsonSyntaxException(
68 1
                    \sprintf(
69 1
                        'Could not parse token "%s" at "%s"',
70
                        $reader->peek(),
71 1
                        $reader->getPath()
72 1
                    )
73 1
                );
74 1
        }
75 1
76
        return $this->typeAdapterProvider->getAdapter($type)->read($reader);
77
    }
78
79
    /**
80 9
     * 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 8
    }
91
}
92