2020#include " iceberg/catalog/rest/catalog.h"
2121
2222#include < memory>
23+ #include < unordered_map>
2324#include < utility>
2425
2526#include < cpr/cpr.h>
2627
28+ #include " iceberg/catalog/rest/catalog.h"
2729#include " iceberg/catalog/rest/config.h"
2830#include " iceberg/catalog/rest/constant.h"
2931#include " iceberg/catalog/rest/endpoint_util.h"
32+ #include " iceberg/catalog/rest/error_handlers.h"
3033#include " iceberg/catalog/rest/http_client_interal.h"
34+ #include " iceberg/catalog/rest/http_response.h"
3135#include " iceberg/catalog/rest/json_internal.h"
3236#include " iceberg/catalog/rest/types.h"
3337#include " iceberg/json_internal.h"
@@ -41,37 +45,27 @@ Result<std::unique_ptr<RestCatalog>> RestCatalog::Make(const RestCatalogConfig&
4145 // Create ResourcePaths and validate URI
4246 ICEBERG_ASSIGN_OR_RAISE (auto paths, ResourcePaths::Make (config));
4347
44- ICEBERG_ASSIGN_OR_RAISE (auto tmp_client, HttpClient::Make (config));
45-
48+ auto tmp_client = std::make_unique<HttpClient>(config);
4649 const std::string endpoint = paths->V1Config ();
47- cpr::Parameters params;
48- ICEBERG_ASSIGN_OR_RAISE (const auto & response, tmp_client->Get (endpoint, params));
49- switch (response.status_code ) {
50- case cpr::status::HTTP_OK: {
51- ICEBERG_ASSIGN_OR_RAISE (auto json, FromJsonString (response.text ));
52- ICEBERG_ASSIGN_OR_RAISE (auto server_config, CatalogConfigFromJson (json));
53- // Merge server config into client config, server config overrides > client config
54- // properties > server config defaults
55- auto final_props = std::move (server_config.defaults );
56- for (const auto & kv : config.configs ()) {
57- final_props.insert_or_assign (kv.first , kv.second );
58- }
59-
60- for (const auto & kv : server_config.overrides ) {
61- final_props.insert_or_assign (kv.first , kv.second );
62- }
63- auto final_config = RestCatalogConfig::FromMap (final_props);
64- ICEBERG_ASSIGN_OR_RAISE (auto client, HttpClient::Make (*final_config));
65- ICEBERG_ASSIGN_OR_RAISE (auto final_paths, ResourcePaths::Make (*final_config));
66- return std::unique_ptr<RestCatalog>(new RestCatalog (
67- std::move (final_config), std::move (client), std::move (*final_paths)));
68- };
69- default : {
70- ICEBERG_ASSIGN_OR_RAISE (auto json, FromJsonString (response.text ));
71- ICEBERG_ASSIGN_OR_RAISE (auto list_response, ErrorResponseFromJson (json));
72- return UnknownError (" Error listing namespaces: {}" , list_response.error .message );
73- }
50+ ICEBERG_ASSIGN_OR_RAISE (const HttpResponse& response,
51+ tmp_client->Get (endpoint, {}, {}, DefaultErrorHandler ()));
52+ ICEBERG_ASSIGN_OR_RAISE (auto json, FromJsonString (response.body ()));
53+ ICEBERG_ASSIGN_OR_RAISE (auto server_config, CatalogConfigFromJson (json));
54+ // Merge server config into client config, server config overrides > client config
55+ // properties > server config defaults
56+ auto final_props = std::move (server_config.defaults );
57+ for (const auto & kv : config.configs ()) {
58+ final_props.insert_or_assign (kv.first , kv.second );
59+ }
60+
61+ for (const auto & kv : server_config.overrides ) {
62+ final_props.insert_or_assign (kv.first , kv.second );
7463 }
64+ auto final_config = RestCatalogConfig::FromMap (final_props);
65+ auto client = std::make_unique<HttpClient>(*final_config);
66+ ICEBERG_ASSIGN_OR_RAISE (auto final_paths, ResourcePaths::Make (*final_config));
67+ return std::unique_ptr<RestCatalog>(new RestCatalog (
68+ std::move (final_config), std::move (client), std::move (*final_paths)));
7569}
7670
7771RestCatalog::RestCatalog (std::unique_ptr<RestCatalogConfig> config,
@@ -91,35 +85,26 @@ Result<std::vector<Namespace>> RestCatalog::ListNamespaces(const Namespace& ns)
9185 std::vector<Namespace> result;
9286 std::string next_token;
9387 while (true ) {
94- cpr::Parameters params;
88+ std::unordered_map<std::string, std::string> params;
9589 if (!ns.levels .empty ()) {
96- params. Add ({ std::string ( kQueryParamParent ), EncodeNamespaceForUrl (ns)} );
90+ params[ kQueryParamParent ] = EncodeNamespaceForUrl (ns);
9791 }
9892 if (!next_token.empty ()) {
99- params. Add ({ std::string ( kQueryParamPageToken ), next_token}) ;
93+ params[ kQueryParamPageToken ] = next_token;
10094 }
101- ICEBERG_ASSIGN_OR_RAISE (const auto & response, client_->Get (endpoint, params));
102- switch (response.status_code ) {
103- case cpr::status::HTTP_OK: {
104- ICEBERG_ASSIGN_OR_RAISE (auto json, FromJsonString (response.text ));
105- ICEBERG_ASSIGN_OR_RAISE (auto list_response, ListNamespacesResponseFromJson (json));
106- result.insert (result.end (), list_response.namespaces .begin (),
107- list_response.namespaces .end ());
108- if (list_response.next_page_token .empty ()) {
109- return result;
110- }
111- next_token = list_response.next_page_token ;
112- continue ;
113- }
114- case cpr::status::HTTP_NOT_FOUND: {
115- return NoSuchNamespace (" Namespace not found" );
116- }
117- default :
118- ICEBERG_ASSIGN_OR_RAISE (auto json, FromJsonString (response.text ));
119- ICEBERG_ASSIGN_OR_RAISE (auto list_response, ErrorResponseFromJson (json));
120- return UnknownError (" Error listing namespaces: {}" , list_response.error .message );
95+ ICEBERG_ASSIGN_OR_RAISE (const auto & response,
96+ client_->Get (endpoint, params, {}, NamespaceErrorHandler ()));
97+ ICEBERG_ASSIGN_OR_RAISE (auto json, FromJsonString (response.body ()));
98+ ICEBERG_ASSIGN_OR_RAISE (auto list_response, ListNamespacesResponseFromJson (json));
99+ result.insert (result.end (), list_response.namespaces .begin (),
100+ list_response.namespaces .end ());
101+ if (list_response.next_page_token .empty ()) {
102+ return result;
121103 }
104+ next_token = list_response.next_page_token ;
105+ continue ;
122106 }
107+ return result;
123108}
124109
125110Status RestCatalog::CreateNamespace (
0 commit comments