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

WildcardTypeAdapter   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 70
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 32
c 1
b 0
f 0
dl 0
loc 70
ccs 33
cts 33
cp 1
rs 10
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 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