Skip to content

Commit 9d5a73d

Browse files
committed
refactor: Move validation logic to struct member methods
1 parent 23ed851 commit 9d5a73d

File tree

10 files changed

+118
-140
lines changed

10 files changed

+118
-140
lines changed

src/iceberg/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ set(ICEBERG_SOURCES
5050
sort_order.cc
5151
statistics_file.cc
5252
table.cc
53+
table_identifier.cc
5354
table_metadata.cc
5455
table_properties.cc
5556
table_requirement.cc

src/iceberg/catalog/rest/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# specific language governing permissions and limitations
1616
# under the License.
1717

18-
set(ICEBERG_REST_SOURCES rest_catalog.cc json_internal.cc validator.cc)
18+
set(ICEBERG_REST_SOURCES rest_catalog.cc json_internal.cc types.cc)
1919

2020
set(ICEBERG_REST_STATIC_BUILD_INTERFACE_LIBS)
2121
set(ICEBERG_REST_SHARED_BUILD_INTERFACE_LIBS)

src/iceberg/catalog/rest/json_internal.cc

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
#include <nlohmann/json.hpp>
2727

2828
#include "iceberg/catalog/rest/types.h"
29-
#include "iceberg/catalog/rest/validator.h"
3029
#include "iceberg/json_internal.h"
3130
#include "iceberg/table_identifier.h"
3231
#include "iceberg/util/json_util_internal.h"
@@ -88,7 +87,7 @@ Result<CatalogConfig> CatalogConfigFromJson(const nlohmann::json& json) {
8887
ICEBERG_ASSIGN_OR_RAISE(
8988
config.endpoints,
9089
GetJsonValueOrDefault<std::vector<std::string>>(json, kEndpoints));
91-
ICEBERG_RETURN_UNEXPECTED(Validator::Validate(config));
90+
ICEBERG_RETURN_UNEXPECTED(config.Validate());
9291
return config;
9392
}
9493

@@ -111,7 +110,7 @@ Result<ErrorModel> ErrorModelFromJson(const nlohmann::json& json) {
111110
ICEBERG_ASSIGN_OR_RAISE(error.code, GetJsonValue<uint32_t>(json, kCode));
112111
ICEBERG_ASSIGN_OR_RAISE(error.stack,
113112
GetJsonValueOrDefault<std::vector<std::string>>(json, kStack));
114-
ICEBERG_RETURN_UNEXPECTED(Validator::Validate(error));
113+
ICEBERG_RETURN_UNEXPECTED(error.Validate());
115114
return error;
116115
}
117116

@@ -125,7 +124,7 @@ Result<ErrorResponse> ErrorResponseFromJson(const nlohmann::json& json) {
125124
ErrorResponse response;
126125
ICEBERG_ASSIGN_OR_RAISE(auto error_json, GetJsonValue<nlohmann::json>(json, kError));
127126
ICEBERG_ASSIGN_OR_RAISE(response.error, ErrorModelFromJson(error_json));
128-
ICEBERG_RETURN_UNEXPECTED(Validator::Validate(response));
127+
ICEBERG_RETURN_UNEXPECTED(response.Validate());
129128
return response;
130129
}
131130

@@ -144,7 +143,7 @@ Result<CreateNamespaceRequest> CreateNamespaceRequestFromJson(
144143
ICEBERG_ASSIGN_OR_RAISE(
145144
request.properties,
146145
GetJsonValueOrDefault<decltype(request.properties)>(json, kProperties));
147-
ICEBERG_RETURN_UNEXPECTED(Validator::Validate(request));
146+
ICEBERG_RETURN_UNEXPECTED(request.Validate());
148147
return request;
149148
}
150149

@@ -162,7 +161,7 @@ Result<UpdateNamespacePropertiesRequest> UpdateNamespacePropertiesRequestFromJso
162161
request.removals, GetJsonValueOrDefault<std::vector<std::string>>(json, kRemovals));
163162
ICEBERG_ASSIGN_OR_RAISE(
164163
request.updates, GetJsonValueOrDefault<decltype(request.updates)>(json, kUpdates));
165-
ICEBERG_RETURN_UNEXPECTED(Validator::Validate(request));
164+
ICEBERG_RETURN_UNEXPECTED(request.Validate());
166165
return request;
167166
}
168167

@@ -183,7 +182,7 @@ Result<RegisterTableRequest> RegisterTableRequestFromJson(const nlohmann::json&
183182
GetJsonValue<std::string>(json, kMetadataLocation));
184183
ICEBERG_ASSIGN_OR_RAISE(request.overwrite,
185184
GetJsonValueOrDefault<bool>(json, kOverwrite, false));
186-
ICEBERG_RETURN_UNEXPECTED(Validator::Validate(request));
185+
ICEBERG_RETURN_UNEXPECTED(request.Validate());
187186
return request;
188187
}
189188

@@ -201,7 +200,7 @@ Result<RenameTableRequest> RenameTableRequestFromJson(const nlohmann::json& json
201200
ICEBERG_ASSIGN_OR_RAISE(auto dest_json,
202201
GetJsonValue<nlohmann::json>(json, kDestination));
203202
ICEBERG_ASSIGN_OR_RAISE(request.destination, TableIdentifierFromJson(dest_json));
204-
ICEBERG_RETURN_UNEXPECTED(Validator::Validate(request));
203+
ICEBERG_RETURN_UNEXPECTED(request.Validate());
205204
return request;
206205
}
207206

@@ -248,7 +247,7 @@ Result<ListNamespacesResponse> ListNamespacesResponseFromJson(
248247
ICEBERG_ASSIGN_OR_RAISE(auto ns, NamespaceFromJson(ns_json));
249248
response.namespaces.push_back(std::move(ns));
250249
}
251-
ICEBERG_RETURN_UNEXPECTED(Validator::Validate(response));
250+
ICEBERG_RETURN_UNEXPECTED(response.Validate());
252251
return response;
253252
}
254253

@@ -304,7 +303,7 @@ Result<UpdateNamespacePropertiesResponse> UpdateNamespacePropertiesResponseFromJ
304303
response.removed, GetJsonValueOrDefault<std::vector<std::string>>(json, kRemoved));
305304
ICEBERG_ASSIGN_OR_RAISE(
306305
response.missing, GetJsonValueOrDefault<std::vector<std::string>>(json, kMissing));
307-
ICEBERG_RETURN_UNEXPECTED(Validator::Validate(response));
306+
ICEBERG_RETURN_UNEXPECTED(response.Validate());
308307
return response;
309308
}
310309

@@ -329,7 +328,7 @@ Result<ListTablesResponse> ListTablesResponseFromJson(const nlohmann::json& json
329328
ICEBERG_ASSIGN_OR_RAISE(auto identifier, TableIdentifierFromJson(id_json));
330329
response.identifiers.push_back(std::move(identifier));
331330
}
332-
ICEBERG_RETURN_UNEXPECTED(Validator::Validate(response));
331+
ICEBERG_RETURN_UNEXPECTED(response.Validate());
333332
return response;
334333
}
335334

src/iceberg/catalog/rest/meson.build

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,7 @@
1515
# specific language governing permissions and limitations
1616
# under the License.
1717

18-
iceberg_rest_sources = files(
19-
'json_internal.cc',
20-
'rest_catalog.cc',
21-
'validator.cc',
22-
)
18+
iceberg_rest_sources = files('json_internal.cc', 'rest_catalog.cc', 'types.cc')
2319
# cpr does not export symbols, so on Windows it must
2420
# be used as a static lib
2521
cpr_needs_static = (
@@ -51,6 +47,6 @@ meson.override_dependency('iceberg-rest', iceberg_rest_dep)
5147
pkg.generate(iceberg_rest_lib)
5248

5349
install_headers(
54-
['rest_catalog.h', 'types.h', 'json_internal.h', 'validator.h'],
50+
['rest_catalog.h', 'types.h', 'json_internal.h'],
5551
subdir: 'iceberg/catalog/rest',
5652
)

src/iceberg/catalog/rest/validator.cc renamed to src/iceberg/catalog/rest/types.cc

Lines changed: 26 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -17,35 +17,35 @@
1717
* under the License.
1818
*/
1919

20-
#include "iceberg/catalog/rest/validator.h"
20+
#include "iceberg/catalog/rest/types.h"
2121

2222
#include <algorithm>
2323
#include <format>
2424

25-
#include "iceberg/catalog/rest/types.h"
2625
#include "iceberg/result.h"
26+
#include "iceberg/table_identifier.h"
2727
#include "iceberg/util/formatter_internal.h"
2828
#include "iceberg/util/macros.h"
2929

3030
namespace iceberg::rest {
3131

3232
// Configuration and Error types
3333

34-
Status Validator::Validate(const CatalogConfig& config) {
34+
Status CatalogConfig::Validate() const {
3535
// TODO(Li Feiyang): Add an invalidEndpoint test that validates endpoint format.
3636
// See:
3737
// https://github.com/apache/iceberg/blob/main/core/src/test/java/org/apache/iceberg/rest/responses/TestConfigResponseParser.java#L164
3838
// for reference.
3939
return {};
4040
}
4141

42-
Status Validator::Validate(const ErrorModel& error) {
43-
if (error.message.empty() || error.type.empty()) {
42+
Status ErrorModel::Validate() const {
43+
if (message.empty() || type.empty()) {
4444
return Invalid("Invalid error model: missing required fields");
4545
}
4646

47-
if (error.code < 400 || error.code > 600) {
48-
return Invalid("Invalid error model: code {} is out of range [400, 600]", error.code);
47+
if (code < 400 || code > 600) {
48+
return Invalid("Invalid error model: code {} is out of range [400, 600]", code);
4949
}
5050

5151
// stack is optional, no validation needed
@@ -54,21 +54,21 @@ Status Validator::Validate(const ErrorModel& error) {
5454

5555
// We don't validate the error field because ErrorModel::Validate has been called in the
5656
// FromJson.
57-
Status Validator::Validate(const ErrorResponse& response) { return {}; }
57+
Status ErrorResponse::Validate() const { return {}; }
5858

5959
// Namespace operations
6060

61-
Status Validator::Validate(const ListNamespacesResponse& response) { return {}; }
61+
Status ListNamespacesResponse::Validate() const { return {}; }
6262

63-
Status Validator::Validate(const CreateNamespaceRequest& request) { return {}; }
63+
Status CreateNamespaceRequest::Validate() const { return {}; }
6464

65-
Status Validator::Validate(const CreateNamespaceResponse& response) { return {}; }
65+
Status CreateNamespaceResponse::Validate() const { return {}; }
6666

67-
Status Validator::Validate(const GetNamespaceResponse& response) { return {}; }
67+
Status GetNamespaceResponse::Validate() const { return {}; }
6868

69-
Status Validator::Validate(const UpdateNamespacePropertiesRequest& request) {
69+
Status UpdateNamespacePropertiesRequest::Validate() const {
7070
// keys in updates and removals must not overlap
71-
if (request.removals.empty() || request.updates.empty()) {
71+
if (removals.empty() || updates.empty()) {
7272
return {};
7373
}
7474

@@ -83,9 +83,9 @@ Status Validator::Validate(const UpdateNamespacePropertiesRequest& request) {
8383
};
8484

8585
auto sorted_removals =
86-
extract_and_sort(request.removals, [](const auto& s) -> const auto& { return s; });
86+
extract_and_sort(removals, [](const auto& s) -> const auto& { return s; });
8787
auto sorted_update_keys = extract_and_sort(
88-
request.updates, [](const auto& pair) -> const auto& { return pair.first; });
88+
updates, [](const auto& pair) -> const auto& { return pair.first; });
8989

9090
std::vector<std::string_view> common;
9191
std::ranges::set_intersection(sorted_removals, sorted_update_keys,
@@ -99,43 +99,34 @@ Status Validator::Validate(const UpdateNamespacePropertiesRequest& request) {
9999
return {};
100100
}
101101

102-
Status Validator::Validate(const UpdateNamespacePropertiesResponse& response) {
103-
return {};
104-
}
102+
Status UpdateNamespacePropertiesResponse::Validate() const { return {}; }
105103

106104
// Table operations
107105

108-
Status Validator::Validate(const ListTablesResponse& response) { return {}; }
106+
Status ListTablesResponse::Validate() const { return {}; }
109107

110-
Status Validator::Validate(const LoadTableResult& result) {
111-
if (!result.metadata) {
108+
Status LoadTableResult::Validate() const {
109+
if (!metadata) {
112110
return Invalid("Invalid metadata: null");
113111
}
114112
return {};
115113
}
116114

117-
Status Validator::Validate(const RegisterTableRequest& request) {
118-
if (request.name.empty()) {
115+
Status RegisterTableRequest::Validate() const {
116+
if (name.empty()) {
119117
return Invalid("Missing table name");
120118
}
121119

122-
if (request.metadata_location.empty()) {
120+
if (metadata_location.empty()) {
123121
return Invalid("Empty metadata location");
124122
}
125123

126124
return {};
127125
}
128126

129-
Status Validator::Validate(const RenameTableRequest& request) {
130-
ICEBERG_RETURN_UNEXPECTED(Validate(request.source));
131-
ICEBERG_RETURN_UNEXPECTED(Validate(request.destination));
132-
return {};
133-
}
134-
135-
Status Validator::Validate(const TableIdentifier& identifier) {
136-
if (identifier.name.empty()) {
137-
return Invalid("Invalid table identifier: missing table name");
138-
}
127+
Status RenameTableRequest::Validate() const {
128+
ICEBERG_RETURN_UNEXPECTED(source.Validate());
129+
ICEBERG_RETURN_UNEXPECTED(destination.Validate());
139130
return {};
140131
}
141132

0 commit comments

Comments
 (0)