| 1174 | } |
| 1175 | |
| 1176 | CesiumAsync::Future<Response<GeocoderResult>> Connection::geocode( |
| 1177 | GeocoderProviderType provider, |
| 1178 | GeocoderRequestType type, |
| 1179 | const std::string& query) const { |
| 1180 | const std::string endpointUrl = type == GeocoderRequestType::Autocomplete |
| 1181 | ? "v1/geocode/autocomplete" |
| 1182 | : "v1/geocode/search"; |
| 1183 | std::string requestUrl = |
| 1184 | CesiumUtility::Uri::resolve(this->_apiUrl, endpointUrl); |
| 1185 | requestUrl = CesiumUtility::Uri::addQuery(requestUrl, "text", query); |
| 1186 | |
| 1187 | // Add provider type to url |
| 1188 | switch (provider) { |
| 1189 | case GeocoderProviderType::Bing: |
| 1190 | requestUrl = CesiumUtility::Uri::addQuery(requestUrl, "geocoder", "bing"); |
| 1191 | break; |
| 1192 | case GeocoderProviderType::Google: |
| 1193 | requestUrl = CesiumUtility::Uri::addQuery(requestUrl, "geocoder", "google"); |
| 1194 | break; |
| 1195 | case GeocoderProviderType::Default: |
| 1196 | break; |
| 1197 | } |
| 1198 | |
| 1199 | return this->ensureValidToken().thenImmediately( |
| 1200 | [pAssetAccessor = this->_pAssetAccessor, |
| 1201 | asyncSystem = this->_asyncSystem, |
| 1202 | requestUrl](Result<std::string>&& result) { |
| 1203 | if (!result.value) { |
| 1204 | return asyncSystem.createResolvedFuture( |
| 1205 | createNoValidTokenResponse<GeocoderResult>(std::move(result))); |
| 1206 | } |
| 1207 | |
| 1208 | return pAssetAccessor |
| 1209 | ->get( |
| 1210 | asyncSystem, |
| 1211 | requestUrl, |
| 1212 | {{"Accept", "application/json"}, |
| 1213 | {"Authorization", *result.value}}) |
| 1214 | .thenImmediately( |
| 1215 | [](std::shared_ptr<CesiumAsync::IAssetRequest>&& pRequest) { |
| 1216 | const IAssetResponse* pResponse = pRequest->response(); |
| 1217 | if (!pResponse) { |
| 1218 | return createEmptyResponse<GeocoderResult>(); |
| 1219 | } |
| 1220 | |
| 1221 | if (pResponse->statusCode() < 200 || |
| 1222 | pResponse->statusCode() >= 300) { |
| 1223 | return createErrorResponse<GeocoderResult>(pResponse); |
| 1224 | } |
| 1225 | |
| 1226 | rapidjson::Document d; |
| 1227 | if (!parseJsonObject(pResponse, d)) { |
| 1228 | return createJsonErrorResponse<GeocoderResult>( |
| 1229 | pResponse, |
| 1230 | d); |
| 1231 | } |
| 1232 | if (!d.IsObject()) { |
| 1233 | return createJsonTypeResponse<GeocoderResult>( |
no test coverage detected