载入中...
搜索中...
未找到
EvpackResourceReader.cpp
浏览该文件的文档.
2
3#include <algorithm>
4#include <new>
5#include <tuple>
6
7namespace eve::asset {
8namespace {} // namespace
9
11 const AssetRef& asset, std::string_view expectedType,
12 const EvpackCapabilities& capabilities, std::uint64_t maximumDecodedBytes) const {
13 if (!pack_ || asset.id().isNil() || expectedType.empty())
15 "pack, asset and expected type are required", {},
16 {}, "asset.evpack.reader"));
17 auto selected = selectEvpackVariant(*pack_, capabilities);
18 if (!selected) return Result<RuntimeAssetPayload>::failure(selected.status());
19 RuntimeAssetPayload result{asset, {}, {}, selected.value(), {}};
20 bool identityFound = false;
21 bool typeFound = false;
22 std::uint64_t decodedTotal = 0;
23 for (std::size_t index = 0; index < pack_->chunks().size(); ++index) {
24 const auto& chunk = pack_->chunks()[index];
25 if (chunk.assetId != asset.id()) continue;
26 identityFound = true;
27 const std::string actualType = chunk.type + "/" + std::to_string(chunk.schemaVersion.value());
28 if (actualType != expectedType) continue;
29 typeFound = true;
30 if (chunk.variantIndex != selected.value().index) continue;
31 if (decodedTotal > maximumDecodedBytes || chunk.decodedSize > maximumDecodedBytes - decodedTotal)
33 "asset payload exceeds decoded budget",
34 asset.format(), {}, "asset.evpack.reader"));
35 auto bytes = pack_->decodeChunk(index, maximumDecodedBytes - decodedTotal);
37 decodedTotal += bytes.value().size();
38 result.type = chunk.type;
39 result.schemaVersion = chunk.schemaVersion;
40 result.chunks.push_back({chunk.kind, chunk.chunkId, std::move(bytes).takeValue()});
41 }
42 if (result.chunks.empty()) {
43 if (identityFound && !typeFound)
45 Diagnostic::error(DiagnosticCode::TypeMismatch, "asset does not provide the expected type/version",
46 asset.format(), {}, "asset.evpack.reader"));
47 if (typeFound)
49 "asset has no chunk for the selected variant",
50 asset.format(), {}, "asset.evpack.reader"));
52 asset.format(), {}, "asset.evpack.reader"));
53 }
54 std::sort(result.chunks.begin(), result.chunks.end(), [](const auto& left, const auto& right) {
55 return std::tie(left.kind, left.chunkId) < std::tie(right.kind, right.chunkId);
56 });
57 if (result.chunks.front().kind != EvpackChunkKind::Definition)
59 "asset has no definition chunk", asset.format(),
60 {}, "asset.evpack.reader"));
61 return Result<RuntimeAssetPayload>::success(std::move(result));
62}
63
65 std::string_view expectedType, const EvpackCapabilities& capabilities, std::uint32_t maximumAssets) const {
66 if (!pack_ || expectedType.empty() || maximumAssets == 0)
67 return Result<std::vector<AssetRef>>::failure(
68 Diagnostic::error(DiagnosticCode::InvalidArgument, "pack, expected type and asset budget are required", {},
69 {}, "asset.evpack.reader"));
70 auto selected = selectEvpackVariant(*pack_, capabilities);
71 if (!selected) return Result<std::vector<AssetRef>>::failure(selected.status());
72 try {
73 std::vector<PersistentId> identities;
74 for (const auto& chunk : pack_->chunks()) {
75 const std::string actualType = chunk.type + "/" + std::to_string(chunk.schemaVersion.value());
76 if (chunk.variantIndex != selected.value().index || actualType != expectedType) continue;
77 identities.push_back(chunk.assetId);
78 }
79 std::sort(identities.begin(), identities.end());
80 identities.erase(std::unique(identities.begin(), identities.end()), identities.end());
81 if (identities.size() > maximumAssets)
83 DiagnosticCode::InvalidArgument, "asset listing exceeds result budget", {}, {}, "asset.evpack.reader"));
84 std::vector<AssetRef> result;
85 result.reserve(identities.size());
86 for (const auto& identity : identities) {
87 auto reference = AssetRef::fromId(identity);
88 if (!reference) return Result<std::vector<AssetRef>>::failure(reference.status());
89 result.push_back(std::move(reference).takeValue());
90 }
91 return Result<std::vector<AssetRef>>::success(std::move(result));
92 } catch (const std::bad_alloc&) {
94 DiagnosticCode::Failed, "asset listing allocation failed", {}, {}, "asset.evpack.reader"));
95 }
96}
97} // namespace eve::asset
AuthorityStoreHandleRef reference
Definition Authority.cpp:24
Typed capability-aware runtime access to admitted packs.
HexVec3 left
HexVec3 right
std::uint64_t bytes
float size
Definition TreeMesh.cpp:156
uint32_t index
Stable asset identity backed by PersistentId.
Definition ResourceRef.h:53
const PersistentId & id() const noexcept
Return the stable asset identity.
Definition ResourceRef.h:65
static Result< AssetRef > fromId(PersistentId id)
Build an asset reference from a non-nil persistent identity.
std::string format() const
Return canonical asset://<uuid> text.
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 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
Result< std::vector< AssetRef > > listAssets(std::string_view expectedType, const EvpackCapabilities &capabilities, std::uint32_t maximumAssets=1 '000 '000) const
List stable assets providing an exact type/version for the selected runtime variant.
Result< RuntimeAssetPayload > read(const AssetRef &asset, std::string_view expectedType, const EvpackCapabilities &capabilities, std::uint64_t maximumDecodedBytes) const
Resolve, type-check, variant-select and decode a canonical runtime asset.
constexpr bool isNil() const noexcept
Returns whether this value is the all-zero nil ID.
Definition Identity.h:176
Result< EvpackVariantSelection > selectEvpackVariant(const Evpack &pack, const EvpackCapabilities &capabilities)
Select the first explicitly ordered variant satisfied by device capabilities.
Definition Evpack.cpp:585
@ TypeMismatch
A stable reference resolved to a different canonical domain type.
Actual runtime device capabilities used for variant selection.
Definition Evpack.h:92
Owning backend-neutral payload returned to a domain decoder.