载入中...
搜索中...
未找到
Status.h
浏览该文件的文档.
1#pragma once
2
8#include "common/Diagnostic.h"
9#include "common/Export.h"
10
11#include <cstdint>
12#include <ostream>
13#include <string>
14#include <string_view>
15#include <utility>
16#include <vector>
17
18namespace eve {
19
27enum class StatusCode : uint8_t {
28 Ok,
29 Applied,
30 NoOp,
31 Pending,
37 Failed,
38};
39
45[[nodiscard]] constexpr std::string_view statusCodeName(StatusCode code) noexcept {
46 switch (code) {
47 case StatusCode::Ok: return "ok";
48 case StatusCode::Applied: return "applied";
49 case StatusCode::NoOp: return "no_op";
50 case StatusCode::Pending: return "pending";
51 case StatusCode::Rejected: return "rejected";
52 case StatusCode::Conflict: return "conflict";
53 case StatusCode::NotFound: return "not_found";
54 case StatusCode::Unsupported: return "unsupported";
55 case StatusCode::Cancelled: return "cancelled";
56 case StatusCode::Failed: return "failed";
57 }
58 return "unknown";
59}
60
62inline std::ostream& operator<<(std::ostream& stream, StatusCode code) { return stream << statusCodeName(code); }
63
68class [[nodiscard("Status must be inspected or explicitly passed onward")]] EVENGINE_API_FOUNDATION Status {
69public:
71 Status() = default;
72
78 Status(StatusCode code, std::vector<Diagnostic> diagnostics) : code_(code), diagnostics_(std::move(diagnostics)) {}
79
81 static Status success(StatusCode code = StatusCode::Ok) { return Status(code, {}); }
82
84 static Status failure(StatusCode code, Diagnostic diagnostic) {
85 std::vector<Diagnostic> diagnostics;
86 diagnostics.emplace_back(std::move(diagnostic));
88 return Status(code, std::move(diagnostics));
89 }
90
92 static Status failure(Diagnostic diagnostic) {
94 return failure(statusCodeFor(diagnostic.code()), std::move(diagnostic));
95 }
96
98 StatusCode code() const noexcept { return code_; }
99
101 bool isSuccess() const noexcept {
102 switch (code_) {
103 case StatusCode::Ok:
104 case StatusCode::Applied:
105 case StatusCode::NoOp:
106 case StatusCode::Pending: return true;
107 case StatusCode::Rejected:
108 case StatusCode::Conflict:
109 case StatusCode::NotFound:
110 case StatusCode::Unsupported:
111 case StatusCode::Cancelled:
112 case StatusCode::Failed: return false;
113 }
114 return false;
115 }
116
118 bool isFailure() const noexcept { return !isSuccess(); }
119
121 bool hasDiagnostics() const noexcept { return !diagnostics_.empty(); }
122
124 const std::vector<Diagnostic>& diagnostics() const noexcept { return diagnostics_; }
125
135 const Diagnostic* primaryDiagnostic() const noexcept {
136 return diagnostics_.empty() ? nullptr : &diagnostics_.front();
137 }
138
143 std::string describe() const {
145 std::string result(statusCodeName(code_));
146 if (const Diagnostic* diagnostic = primaryDiagnostic()) {
147 result += ": ";
148 result += diagnostic->message();
149 if (!diagnostic->path().empty()) {
150 result += " [";
151 result += diagnostic->path();
152 result += ']';
153 }
154 }
155 return result;
156 }
157
158private:
159 static StatusCode statusCodeFor(DiagnosticCode code) noexcept {
160 switch (code) {
161 case DiagnosticCode::InvalidArgument:
162 case DiagnosticCode::PreconditionViolation: return StatusCode::Rejected;
163 case DiagnosticCode::NotFound: return StatusCode::NotFound;
164 case DiagnosticCode::AlreadyExists:
165 case DiagnosticCode::Conflict: return StatusCode::Conflict;
166 case DiagnosticCode::Unsupported: return StatusCode::Unsupported;
167 case DiagnosticCode::Cancelled: return StatusCode::Cancelled;
168 case DiagnosticCode::StaleHandle: return StatusCode::Rejected;
169 case DiagnosticCode::TypeMismatch: return StatusCode::Rejected;
170 case DiagnosticCode::ParseError:
171 case DiagnosticCode::SerializationError:
172 case DiagnosticCode::InvariantViolation:
173 case DiagnosticCode::Failed:
174 case DiagnosticCode::HashMismatch:
175 case DiagnosticCode::UnknownVersion:
176 case DiagnosticCode::CallbackFailure:
177 case DiagnosticCode::DialogueNotWaitingForChoice:
178 case DiagnosticCode::DialogueNotWaitingForCommand:
179 case DiagnosticCode::DialogueConditionRejected:
180 case DiagnosticCode::ProcgenGroupDataInvalid:
181 case DiagnosticCode::None: return StatusCode::Failed;
182 case DiagnosticCode::DialogueRouteNotFound: return StatusCode::NotFound;
183 }
184 return StatusCode::Failed;
185 }
186
187 StatusCode code_ = StatusCode::Ok;
188 std::vector<Diagnostic> diagnostics_;
189};
190
191} // namespace eve
Stable, structured diagnostics shared by engine modules.
#define EVENGINE_API_FOUNDATION
每个链接组(link group)各自的导出宏。
Definition Export.h:106
DiagnosticCode code
A structured explanation of a failed, degraded, or noteworthy result.
Definition Diagnostic.h:94
DiagnosticCode code() const noexcept
Stable machine-readable code.
Definition Diagnostic.h:143
Structured status and zero or more diagnostics for an operation.
Definition Status.h:68
StatusCode code() const noexcept
Stable operation outcome.
Definition Status.h:98
Status()=default
Construct a successful Ok status with no diagnostics.
Status(StatusCode code, std::vector< Diagnostic > diagnostics)
Construct a status from a code and diagnostics.
Definition Status.h:78
static Status failure(Diagnostic diagnostic)
Construct the matching failure category from a diagnostic code.
Definition Status.h:92
static Status failure(StatusCode code, Diagnostic diagnostic)
Construct a failed status with one diagnostic.
Definition Status.h:84
bool isSuccess() const noexcept
Whether the operation completed without a failure outcome.
Definition Status.h:101
std::string describe() const
Render a compact human-readable summary.
Definition Status.h:143
const Diagnostic * primaryDiagnostic() const noexcept
First diagnostic, or null when no diagnostic was supplied.
Definition Status.h:135
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
const std::vector< Diagnostic > & diagnostics() const noexcept
All diagnostics in stable insertion order.
Definition Status.h:124
bool isFailure() const noexcept
Whether the operation has a failure outcome.
Definition Status.h:118
bool hasDiagnostics() const noexcept
True when this status has at least one diagnostic.
Definition Status.h:121
Build metadata (engine git commit, build time, third-party version).
Definition Build.cpp:16
DiagnosticCode
Stable machine-readable diagnostic codes.
Definition Diagnostic.h:47
std::ostream & operator<<(std::ostream &stream, Severity severity)
Writes a severity for diagnostics and test output.
Definition Diagnostic.h:39
StatusCode
Stable outcome category for an operation.
Definition Status.h:27
constexpr std::string_view statusCodeName(StatusCode code) noexcept
Return the stable protocol spelling of a status code.
Definition Status.h:45