15 enum class Status { Success, Failure, Error, Skipped };
20 void set_status(Status status)
noexcept { status_ = status; }
21 [[nodiscard]] Status status()
const noexcept {
return status_; }
22 [[nodiscard]]
bool is_success()
const noexcept {
return status_ == Status::Success; }
23 [[nodiscard]]
bool is_failure()
const noexcept {
return status_ == Status::Failure; }
24 [[nodiscard]]
bool skipped()
const noexcept {
return status_ == Status::Skipped; }
25 [[nodiscard]]
bool is_error()
const noexcept {
return status_ == Status::Error; }
27 static Result reduce(
const Result& lhs,
const Result& rhs)
noexcept {
28 if (lhs.is_failure()) {
30 }
else if (rhs.is_failure()) {
32 }
else if (lhs.is_success()) {
34 }
else if (rhs.is_success()) {
42 [[nodiscard]] std::source_location get_location()
const noexcept {
return location; }
43 [[nodiscard]] std::string get_location_string()
const noexcept {
44 return std::format(
"{}:{}:{}", location.file_name(), location.line(), location.column());
47 [[nodiscard]] std::string get_type()
const noexcept {
return type; }
48 [[nodiscard]] std::string get_type()
noexcept {
return type; }
49 void set_type(std::string type)
noexcept { this->type = std::move(type); }
52 std::string get_message()
noexcept {
return message; }
53 [[nodiscard]] std::string get_message()
const noexcept {
return message; }
54 Result& set_message(std::string message)
noexcept {
55 this->message = std::move(message);
60 static Result success(std::source_location location)
noexcept {
return {Status::Success, location}; }
61 static Result failure(std::source_location location)
noexcept {
return {Status::Failure, location}; }
62 static Result success_with(std::source_location location, std::string success_message)
noexcept {
63 return {Status::Success, location, std::move(success_message)};
65 static Result failure_with(std::source_location location, std::string failure_message)
noexcept {
66 return {Status::Failure, location, std::move(failure_message)};
69 static Result error(std::source_location location)
noexcept {
return {Status::Error, location}; }
70 static Result error_with(std::source_location location, std::string error_message)
noexcept {
71 return {Status::Error, location, std::move(error_message)};
74 static Result skipped(std::source_location location)
noexcept {
return {Status::Skipped, location}; }
75 static Result skipped_with(std::source_location location, std::string skipped_message)
noexcept {
76 return {Status::Skipped, location, std::move(skipped_message)};
82 friend std::ostream& operator<<(std::ostream& os,
const Result& res) {
84 switch (res.status()) {
99 if (not res.get_message().empty()) {
100 ss <<
"(\"" + res.get_message() +
"\")";
103 return os << ss.str();
107 Status status_ = Status::Success;
108 std::source_location location;
111 Result(Status status, std::source_location location, std::string message =
"") noexcept
112 : status_(status), location(location), message(std::move(message)) {}