28#include "iceberg/iceberg_export.h"
29#include "iceberg/result.h"
33#define ICEBERG_BUILDER_RETURN_IF_ERROR(result) \
34 if (auto&& result_name = result; !result_name) [[unlikely]] { \
35 errors_.emplace_back(std::move(result_name.error())); \
39#define ICEBERG_BUILDER_ASSIGN_OR_RETURN_IMPL(result_name, lhs, rexpr) \
40 auto&& result_name = (rexpr); \
41 ICEBERG_BUILDER_RETURN_IF_ERROR(result_name) \
42 lhs = std::move(result_name.value());
44#define ICEBERG_BUILDER_ASSIGN_OR_RETURN(lhs, rexpr) \
45 ICEBERG_BUILDER_ASSIGN_OR_RETURN_IMPL( \
46 ICEBERG_ASSIGN_OR_RAISE_NAME(result_, __COUNTER__), lhs, rexpr)
48#define ICEBERG_BUILDER_ASSIGN_OR_RETURN_WITH_ERROR_IMPL(result_name, lhs, rexpr, ...) \
49 auto&& result_name = (rexpr); \
50 if (!result_name) [[unlikely]] { \
51 return AddError(ErrorKind::kInvalidArgument, __VA_ARGS__); \
53 lhs = std::move(result_name.value());
55#define ICEBERG_BUILDER_ASSIGN_OR_RETURN_WITH_ERROR(lhs, rexpr, ...) \
56 ICEBERG_BUILDER_ASSIGN_OR_RETURN_WITH_ERROR_IMPL( \
57 ICEBERG_ASSIGN_OR_RAISE_NAME(result_, __COUNTER__), lhs, rexpr, __VA_ARGS__)
59#define ICEBERG_BUILDER_CHECK(expr, ...) \
61 if (!(expr)) [[unlikely]] { \
62 return AddError(ErrorKind::kInvalidArgument, __VA_ARGS__); \
111 template <
typename... Args>
112 auto&
AddError(
this auto& self, ErrorKind kind,
const std::format_string<Args...> fmt,
114 self.errors_.emplace_back(kind, std::format(fmt, std::forward<Args>(args)...));
127 self.errors_.push_back(std::move(err));
141 auto&
AddError(
this auto& self, std::unexpected<Error> err) {
142 self.errors_.push_back(std::move(err.error()));
149 [[nodiscard]]
bool has_errors()
const {
return !errors_.empty(); }
154 [[nodiscard]]
size_t error_count()
const {
return errors_.size(); }
165 if (!errors_.empty()) {
166 std::string error_msg =
"Validation failed due to the following errors:\n";
167 for (
const auto& [kind, message] : errors_) {
168 error_msg +=
" - " + message +
"\n";
170 return ValidationFailed(
"{}", error_msg);
182 [[nodiscard]]
const std::vector<Error>&
errors()
const {
return errors_; }
185 std::vector<Error> errors_;
Base class for collecting errors in the builder pattern.
Definition error_collector.h:93
const std::vector< Error > & errors() const
Get read-only access to all collected errors.
Definition error_collector.h:182
Status CheckErrors() const
Check for accumulated errors and return them if any exist.
Definition error_collector.h:164
void ClearErrors()
Clear all accumulated errors.
Definition error_collector.h:179
auto & AddError(this auto &self, ErrorKind kind, const std::format_string< Args... > fmt, Args &&... args)
Add a specific error and return reference to derived class.
Definition error_collector.h:112
auto & AddError(this auto &self, std::unexpected< Error > err)
Add an unexpected result's error and return reference to derived class.
Definition error_collector.h:141
auto & AddError(this auto &self, Error err)
Add an existing error object and return reference to derived class.
Definition error_collector.h:126
bool has_errors() const
Check if any errors have been collected.
Definition error_collector.h:149
size_t error_count() const
Get the number of errors collected.
Definition error_collector.h:154
Error with a kind and a message.
Definition result.h:66