载入中...
搜索中...
未找到
ImportReport.cpp
浏览该文件的文档.
2
3#include <algorithm>
4#include <tuple>
5
7namespace {
8
9std::string dispositionName(ImportDisposition disposition) {
10 switch (disposition) {
11 case ImportDisposition::Translated: return "translated";
12 case ImportDisposition::Baked: return "baked";
13 case ImportDisposition::PreservedSource: return "preserved-source";
14 case ImportDisposition::Unsupported: return "unsupported";
15 }
16 return "unsupported";
17}
18
19} // namespace
20
22 const ImportPackageIdentity& package,
23 std::string_view sourceEngine,
24 std::string_view sourceVersion,
26 if (sourceEngine.empty() || prepared.manifest.assets.empty())
28 "import report requires source engine and canonical assets", {},
29 {}, "asset.import"));
30 std::sort(prepared.sourceMappings.begin(), prepared.sourceMappings.end(),
31 [](const auto& left, const auto& right) {
32 if (left.sourceObject != right.sourceObject)
33 return left.sourceObject < right.sourceObject;
34 return left.asset.id() < right.asset.id();
35 });
36 for (std::size_t index = 1; index < prepared.sourceMappings.size(); ++index) {
37 if (prepared.sourceMappings[index - 1].sourceObject ==
38 prepared.sourceMappings[index].sourceObject &&
39 prepared.sourceMappings[index - 1].asset == prepared.sourceMappings[index].asset)
41 Diagnostic::error(DiagnosticCode::AlreadyExists, "duplicate import source mapping",
42 prepared.sourceMappings[index].sourceObject, {}, "asset.import"));
43 }
44 std::sort(prepared.findings.begin(), prepared.findings.end(), [](const auto& left, const auto& right) {
45 return std::tie(left.sourcePath, left.feature, left.disposition, left.message) <
46 std::tie(right.sourcePath, right.feature, right.disposition, right.message);
47 });
48
49 Value::Object report;
50 report["schema"] = Value("eve.asset-import-report");
51 report["schemaVersion"] = Value(std::int64_t(1));
52 report["sourceEngine"] = Value(std::string(sourceEngine));
53 report["sourceVersion"] = Value(std::string(sourceVersion));
54 report["packageName"] = Value(package.packageName);
55 report["packageVersion"] = Value(package.packageVersion);
56 report["importer"] = prepared.manifest.provenance.contains("importer")
57 ? prepared.manifest.provenance.at("importer")
58 : Value("unknown");
59 report["importerVersion"] = prepared.manifest.provenance.contains("importerVersion")
60 ? prepared.manifest.provenance.at("importerVersion")
61 : Value(std::int64_t(0));
62 report["options"] = Value(std::move(options));
63
64 Value::Array mappings;
65 for (const auto& mapping : prepared.sourceMappings)
66 mappings.emplace_back(Value::Object{{"sourceObject", Value(mapping.sourceObject)},
67 {"asset", Value(mapping.asset.format())}});
68 report["sourceObjects"] = Value(std::move(mappings));
69
70 Value::Object counts{{"translated", Value(std::int64_t(0))},
71 {"baked", Value(std::int64_t(0))},
72 {"preserved-source", Value(std::int64_t(0))},
73 {"unsupported", Value(std::int64_t(0))}};
74 Value::Array findings;
75 for (const auto& finding : prepared.findings) {
76 const std::string disposition = dispositionName(finding.disposition);
77 counts[disposition] = Value(counts.at(disposition).asInt() + 1);
78 findings.emplace_back(
79 Value::Object{{"sourcePath", Value(finding.sourcePath)},
80 {"feature", Value(finding.feature)},
81 {"disposition", Value(disposition)},
82 {"severity", Value(finding.severity == ImportSeverity::Warning ? "warning" : "info")},
83 {"message", Value(finding.message)}});
84 }
85 report["counts"] = Value(std::move(counts));
86 report["findings"] = Value(std::move(findings));
87
88 Value::Array assets;
89 for (const auto& asset : prepared.manifest.assets)
90 assets.emplace_back(Value::Object{{"asset", Value(asset.asset.format())},
91 {"type", Value(asset.type + "/" +
92 std::to_string(asset.schemaVersion.value()))},
93 {"contentHash", Value(asset.contentHash)}});
94 report["canonicalAssets"] = Value(std::move(assets));
95 auto keySeed = Value(report).toJson();
96 if (!keySeed) return Result<void>::failure(keySeed.status());
97 const std::string importKey = sha256(std::span<const std::uint8_t>(
98 reinterpret_cast<const std::uint8_t*>(keySeed.value().data()), keySeed.value().size()));
99 report["importKey"] = Value(importKey);
100 auto encoded = Value(std::move(report)).toJson();
101 if (!encoded) return Result<void>::failure(encoded.status());
102 prepared.entries.push_back({"reports/import.json",
103 {encoded.value().begin(), encoded.value().end()}});
104 prepared.manifest.provenance["path"] = Value("reports/import.json");
105 prepared.manifest.provenance["importKey"] = Value(importKey);
106 prepared.manifest.provenance["sourceEngine"] = Value(std::string(sourceEngine));
107 prepared.manifest.provenance["sourceVersion"] = Value(std::string(sourceVersion));
108 return Result<void>::success();
109}
110
111} // namespace eve::asset_import::detail
HexVec3 left
HexVec3 right
float begin
const SquirrelValueOptions & options
std::vector< ImportFinding > findings
uint32_t index
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
The canonical owning dynamic value used by data-facing protocols.
Definition Value.h:31
std::map< std::string, Value > Object
Definition Value.h:34
std::vector< Value > Array
Definition Value.h:33
std::string sha256(std::span< const std::uint8_t > bytes)
Sha 256.
EVENGINE_API_PLATFORM Result< void > finalizeImportReport(PreparedAssetImport &prepared, const ImportPackageIdentity &package, std::string_view sourceEngine, std::string_view sourceVersion, Value::Object options={})
Append the deterministic mandatory import report and bind it from provenance.
ImportDisposition
Import disposition required for every encountered source feature.
std::variant< std::monostate, std::int64_t, double, std::string, bool > Value
Definition Database.h:26
std::vector< EvaAssetEntry > assets
Definition EvaManifest.h:69
Value::Object provenance
Definition EvaManifest.h:72
Common stable package metadata supplied by an import transaction.
Owning, validated source archive candidate not yet published to disk/database.
std::vector< ImportFinding > findings
std::vector< ImportSourceMapping > sourceMappings
glm::uvec4 counts