AdresseResponseDeserializer::deserializeAdresse()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 24

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 24
ccs 13
cts 13
cp 1
rs 9.536
c 0
b 0
f 0
cc 3
nc 3
nop 2
crap 3
1
<?php
2
3
/*
4
 * This file is part of the geo-api-library package.
5
 *
6
 * (c) 2020 WEBEWEB
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace WBW\Library\GeoAPI\Serializer;
13
14
use WBW\Library\GeoAPI\Model\Adresse;
15
use WBW\Library\GeoAPI\Response\Adresse\AbstractCsvResponse;
16
use WBW\Library\GeoAPI\Response\Adresse\ReverseCsvResponse;
17
use WBW\Library\GeoAPI\Response\Adresse\SearchCsvResponse;
18
use WBW\Library\GeoJSON\Model\FeatureCollection;
19
use WBW\Library\GeoJSON\Serializer\JsonDeserializer;
20
21
/**
22
 * Adresse response deserializer.
23
 *
24
 * @author webeweb <https://github.com/webeweb/>
25
 * @package WBW\Library\GeoAPI\Serializer
26
 */
27
class AdresseResponseDeserializer {
28
29
    /**
30
     * Deserialize an adresse.
31
     *
32
     * @param string $response The response.
33
     * @param string[] $headers The headers.
34
     * @return Adresse Returns the adresse.
35
     */
36 25
    protected static function deserializeAdresse(string $response, array $headers): Adresse {
37
38 25
        $model = new Adresse();
39
40 25
        $columns = str_getcsv($response);
41 25
        $methods = static::getMethods();
42
43 25
        for ($i = count($columns) - 1; 0 <= $i; --$i) {
44
45 25
            $k = $headers[$i];
46 25
            $v = $columns[$i];
47
48 25
            if (false === array_key_exists($k, $methods)) {
49 25
                $model->addColumn($k, $v);
50 25
                continue;
51
            }
52
53 25
            $fct = $methods[$k];
54
55 25
            $model->$fct($v);
56
        }
57
58 25
        return $model;
59
    }
60
61
    /**
62
     * Deserialize a CSV response.
63
     *
64
     * @param string $rawResponse The raw response.
65
     * @param AbstractCsvResponse $model The CSV response.
66
     * @return AbstractCsvResponse Returns the CSV response.
67
     */
68 25
    protected static function deserializeCsvResponse(string $rawResponse, AbstractCsvResponse $model): AbstractCsvResponse {
69
70 25
        $model->setRawResponse($rawResponse);
71
72 25
        $lines = explode("\n", $rawResponse);
73
74 25
        $count = count($lines);
75 25
        if ($count <= 1) {
76
            return $model;
77
        }
78
79 25
        $headers = explode(",", $lines[0]);
80
81 25
        for ($i = 1; $i < $count; ++$i) {
82
83 25
            $current = $lines[$i];
84 25
            if ("" === $current) {
85 25
                continue;
86
            }
87
88 25
            $model->addAdresse(static::deserializeAdresse($current, $headers));
89
        }
90
91 25
        return $model;
92
    }
93
94
    /**
95
     * Deserialize a reverse CSV response.
96
     *
97
     * @param string $rawResponse The raw response.
98
     * @return ReverseCsvResponse Returns the reverse CSV response.
99
     */
100 10
    public static function deserializeReverseCsvResponse(string $rawResponse): ReverseCsvResponse {
101 10
        return static::deserializeCsvResponse($rawResponse, new ReverseCsvResponse());
102
    }
103
104
    /**
105
     * Deserialize a reverse response.
106
     *
107
     * @param string $rawResponse The raw response.
108
     * @return FeatureCollection|null Returns the reverse response in case of success, null otherwise.
109
     */
110 5
    public static function deserializeReverseResponse(string $rawResponse): ?FeatureCollection {
111 5
        return static::deserializeSearchResponse($rawResponse);
112
    }
113
114
    /**
115
     * Deserialize a search CSV response.
116
     *
117
     * @param string $rawResponse The raw response.
118
     * @return SearchCsvResponse Returns the search CSV response.
119
     */
120 15
    public static function deserializeSearchCsvResponse(string $rawResponse) {
121 15
        return static::deserializeCsvResponse($rawResponse, new SearchCsvResponse());
122
    }
123
124
    /**
125
     * Deserialize a search response.
126
     *
127
     * @param string $rawResponse The raw response.
128
     * @return FeatureCollection|null Returns the search response in case of success, null otherwise.
129
     */
130 10
    public static function deserializeSearchResponse(string $rawResponse): ?FeatureCollection {
131
132 10
        $response = json_decode($rawResponse, true);
133 10
        if (null === $response) {
134
            return null;
135
        }
136
137 10
        return JsonDeserializer::deserializeFeatureCollection($response);
138
    }
139
140
    /**
141
     * Get the methods.
142
     *
143
     * @return string[] Returns the methods.
144
     */
145 25
    protected static function getMethods(): array {
146
        return [
147 25
            AbstractCsvResponse::RESULT_CITY        => "setCity",
148
            AbstractCsvResponse::RESULT_CITYCODE    => "setCityCode",
149
            AbstractCsvResponse::RESULT_CONTEXT     => "setContext",
150
            AbstractCsvResponse::RESULT_DISTANCE    => "setDistance",
151
            AbstractCsvResponse::RESULT_DISTRICT    => "setDistrict",
152
            AbstractCsvResponse::RESULT_HOUSENUMBER => "setHouseNumber",
153
            AbstractCsvResponse::RESULT_ID          => "setId",
154
            AbstractCsvResponse::RESULT_LABEL       => "setLabel",
155
            AbstractCsvResponse::RESULT_LATITUDE    => "setLatitude",
156
            AbstractCsvResponse::RESULT_LONGITUDE   => "setLongitude",
157
            AbstractCsvResponse::RESULT_NAME        => "setName",
158
            AbstractCsvResponse::RESULT_OLDCITY     => "setOldCity",
159
            AbstractCsvResponse::RESULT_OLDCITYCODE => "setOldCityCode",
160
            AbstractCsvResponse::RESULT_POSTCODE    => "setPostcode",
161
            AbstractCsvResponse::RESULT_SCORE       => "setScore",
162
            AbstractCsvResponse::RESULT_STREET      => "setStreet",
163
            AbstractCsvResponse::RESULT_TYPE        => "setType",
164
        ];
165
    }
166
}