载入中...
搜索中...
未找到
EditingResult.h
浏览该文件的文档.
1#pragma once
2
3#include "common/Assert.h"
4#include "common/Result.h"
6
7#include <string>
8#include <type_traits>
9#include <utility>
10#include <vector>
11
12namespace eve::editing {
13
17
18template <class T>
20
22inline constexpr const char* kRuleDiagnosticDetail = "rule";
23
26 DiagnosticSeverity severity, std::string message) {
28 details.emplace_back(kRuleDiagnosticDetail, rule.value());
30 return Diagnostic(code, severity, std::move(message), {}, std::move(details), "editing");
31}
32
34[[nodiscard]] inline RuleId diagnosticRule(const Diagnostic& diagnostic) {
35 for (const auto& [key, value] : diagnostic.details())
36 if (key == kRuleDiagnosticDetail) return RuleId(value);
37 return {};
38}
39
41template <class T>
43[[nodiscard]] Result<T> applied(T value, std::vector<Diagnostic> diagnostics = {}) {
45 return Result<T>::success(std::move(value), eve::Status(Status::Applied, std::move(diagnostics)));
46}
47
49template <class T = void>
50 requires std::is_void_v<T>
52[[nodiscard]] Result<void> applied(std::vector<Diagnostic> diagnostics = {}) {
54 return Result<void>::success(eve::Status(Status::Applied, std::move(diagnostics)));
55}
56
58[[nodiscard]] inline Result<void> noOp(std::vector<Diagnostic> diagnostics = {}) {
59 return Result<void>::success(eve::Status(Status::NoOp, std::move(diagnostics)));
60}
61
63[[nodiscard]] inline Result<void> pending(std::vector<Diagnostic> diagnostics = {}) {
64 return Result<void>::success(eve::Status(Status::Pending, std::move(diagnostics)));
65}
66
68template <class T>
70[[nodiscard]] Result<T> failed(Status status, eve::DiagnosticCode code, RuleId rule, std::string message) {
72 EV_ASSERT(eve::Status(status, {}).isFailure(), "editing::failed requires a failure StatusCode");
74 return Result<T>::failure(
76 eve::Status::failure(status, ruleDiagnostic(code, std::move(rule), DiagnosticSeverity::Error,
78 std::move(message))));
79}
80
82[[nodiscard]] constexpr eve::DiagnosticCode diagnosticCodeForStatus(Status status) noexcept {
83 switch (status) {
84 case Status::Rejected: return eve::DiagnosticCode::PreconditionViolation;
85 case Status::Conflict: return eve::DiagnosticCode::Conflict;
86 case Status::NotFound: return eve::DiagnosticCode::NotFound;
87 case Status::Unsupported: return eve::DiagnosticCode::Unsupported;
88 case Status::Cancelled: return eve::DiagnosticCode::Cancelled;
89 case Status::Failed: return eve::DiagnosticCode::Failed;
90 case Status::Ok:
91 case Status::Applied:
92 case Status::NoOp:
93 case Status::Pending: return eve::DiagnosticCode::None;
94 }
96}
97
99template <class T>
101[[nodiscard]] Result<T> failed(Status status, RuleId rule, std::string message) {
102 return failed<T>(status, diagnosticCodeForStatus(status), std::move(rule), std::move(message));
103}
104
106template <class T>
108[[nodiscard]] Result<T> rejected(RuleId rule, std::string message,
110 return failed<T>(Status::Rejected, code, std::move(rule), std::move(message));
111}
112
113} // namespace eve::editing
double value
EVEngine assertion entry point, backed by zeroerr.
#define EV_ASSERT(cond,...)
Assert an internal engine invariant (state that must always hold).
Definition Assert.h:37
std::vector< QuestEvent > pending
std::string message
DiagnosticCode code
std::uint32_t key
wgpu::PopErrorScopeStatus status
Move-only, checked operation results for the common layer.
A structured explanation of a failed, degraded, or noteworthy result.
Definition Diagnostic.h:94
const DiagnosticDetails & details() const noexcept
Structured context in insertion order.
Definition Diagnostic.h:151
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Structured status and zero or more diagnostics for an operation.
Definition Status.h:68
static Status failure(StatusCode code, Diagnostic diagnostic)
Construct a failed status with one diagnostic.
Definition Status.h:84
UUID-backed identifier adapter for legacy textual boundaries.
Definition Identity.h:314
const std::string & value() const noexcept
Returns the exact legacy or canonical compatibility spelling.
Definition Identity.h:362
constexpr eve::DiagnosticCode diagnosticCodeForStatus(Status status) noexcept
Coarse default diagnostic category for a failure status.
constexpr const char * kRuleDiagnosticDetail
Reserved DiagnosticDetails key containing an editing RuleId projection.
eve::Diagnostic Diagnostic
Result< T > rejected(RuleId rule, std::string message, eve::DiagnosticCode code=eve::DiagnosticCode::PreconditionViolation)
Construct a Rejected result for invalid editing input or preconditions.
StrongId< RuleIdTag > RuleId
Definition EditingIds.h:60
Result< T > applied(T value, std::vector< Diagnostic > diagnostics={})
Construct an Applied result with an owning payload and optional diagnostics.
Result< T > failed(Status status, eve::DiagnosticCode code, RuleId rule, std::string message)
Construct a failed editing result with explicit status and diagnostic categories.
Result< void > noOp(std::vector< Diagnostic > diagnostics={})
Construct a successful void result for an operation that made no change.
RuleId diagnosticRule(const Diagnostic &diagnostic)
Return the projected editing rule, or an empty RuleId when absent.
Diagnostic ruleDiagnostic(eve::DiagnosticCode code, RuleId rule, DiagnosticSeverity severity, std::string message)
Build a common diagnostic carrying an open editing rule identity.
std::vector< DiagnosticDetail > DiagnosticDetails
Owning collection of diagnostic details with stable insertion order.
Definition Diagnostic.h:88
DiagnosticCode
Stable machine-readable diagnostic codes.
Definition Diagnostic.h:47
StatusCode
Stable outcome category for an operation.
Definition Status.h:27
Severity
Stable severity of a diagnostic, independent of its display text.
Definition Diagnostic.h:20