载入中...
搜索中...
未找到
EditorDiagnostics.cpp
浏览该文件的文档.
2
4
5namespace eve::editor {
6
8 rules_.emplace(RuleId("settlement.rules.document"),
9 RegisteredRule{"settlement", [](const ValidationRequest& request) {
10 if (request.subject != "settlement.rules")
11 return std::vector<EditorDiagnostic>{};
12 const auto* json = request.value.getIf<std::string>();
13 if (json == nullptr)
14 return std::vector<EditorDiagnostic>{eve::editing::ruleDiagnostic(
16 RuleId("settlement.rules.document"), DiagnosticSeverity::Error,
17 "Settlement rule document must be supplied as JSON text")};
18 auto inspected = settlement::SettlementRuleSet::fromJson(*json);
19 if (inspected) return std::vector<EditorDiagnostic>{};
20 return inspected.status().diagnostics();
21 }});
22}
23
25 if (owner.empty() || id.empty() || !rule)
26 return eve::editing::failed<void>(EditorStatus::Rejected, RuleId("editor.validation.invalid-rule"),
27 "Validation owner, rule id and callback are required");
28 rules_.insert_or_assign(std::move(id), RegisteredRule{std::move(owner), std::move(rule)});
29 return eve::editing::applied<void>();
30}
31
32std::size_t EditorValidationService::unregisterOwner(const std::string& owner) {
33 return std::erase_if(rules_, [&](const auto& entry) { return entry.second.owner == owner; });
34}
35
36std::vector<EditorDiagnostic> EditorValidationService::validate(const ValidationRequest& request) const {
37 std::vector<EditorDiagnostic> diagnostics;
38 for (const auto& [id, registered] : rules_) {
39 (void)id;
40 auto current = registered.rule(request);
41 diagnostics.insert(diagnostics.end(), std::make_move_iterator(current.begin()),
42 std::make_move_iterator(current.end()));
43 }
44 return diagnostics;
45}
46
47void EditorDiagnosticService::publish(std::string source, std::vector<EditorDiagnostic> diagnostics) {
48 std::lock_guard lock(mutex_);
49 channels_.insert_or_assign(std::move(source), std::move(diagnostics));
50}
51
52void EditorDiagnosticService::clear(const std::string& source) {
53 std::lock_guard lock(mutex_);
54 channels_.erase(source);
55}
56
57std::vector<EditorDiagnostic> EditorDiagnosticService::snapshot() const {
58 std::lock_guard lock(mutex_);
59 std::vector<EditorDiagnostic> result;
60 for (const auto& [source, diagnostics] : channels_) {
61 (void)source;
62 result.insert(result.end(), diagnostics.begin(), diagnostics.end());
63 }
64 return result;
65}
66
67} // namespace eve::editor
const GltfImportRequest & request
double current
Declarative, domain-neutral rules for buffs and gameplay effects.
const UnitySourceAsset & source
Move-only operation result carrying either a value or Status.
Definition Result.h:155
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
std::vector< EditorDiagnostic > snapshot() const
Return all channels in deterministic source order.
void clear(const std::string &source)
Clear one producer channel.
void publish(std::string source, std::vector< EditorDiagnostic > diagnostics)
Replace one producer's current diagnostics atomically.
std::function< std::vector< EditorDiagnostic >(const ValidationRequest &)> Rule
std::size_t unregisterOwner(const std::string &owner)
Remove every rule owned by an unloading extension.
Result< void > registerRule(std::string owner, RuleId id, Rule rule)
Register or replace a stable rule owned by an extension.
EditorValidationService()
Construct with built-in validation for canonical settlement rule documents.
std::vector< EditorDiagnostic > validate(const ValidationRequest &request) const
Execute all registered rules in deterministic rule-id order.
static eve::Result< SettlementRuleSet > fromJson(std::string_view json)
Decode and compile a strict versioned JSON rule document without mutating an existing rule set.
Diagnostic ruleDiagnostic(eve::DiagnosticCode code, RuleId rule, DiagnosticSeverity severity, std::string message)
Build a common diagnostic carrying an open editing rule identity.
eve::editing::RuleId RuleId
Definition EditorIds.h:32
@ TypeMismatch
A stable reference resolved to a different canonical domain type.
Context supplied to project- and document-level validation rules.