载入中...
搜索中...
未找到
ResourceRef.cpp
浏览该文件的文档.
2
3#include <utility>
4
5namespace eve {
6namespace {
7
8template <typename T>
9[[nodiscard]] Result<T> parseFailure(std::string message, std::string_view path) {
11}
12
13template <typename T>
14[[nodiscard]] Result<T> statusFailure(const Status& status) {
16}
17
18} // namespace
19
22 if (!uri.ok()) return statusFailure<AssetRef>(uri.status());
23 return fromUri(std::move(uri).takeValue());
24}
25
27 if (id.isNil()) return parseFailure<AssetRef>("asset identity must not be nil", "asset://");
29}
30
32 if (uri.scheme() != UriScheme::Asset || !uri.query().empty() || !uri.fragment().empty()) {
33 return parseFailure<AssetRef>("AssetRef requires an asset:// UUID without query or fragment", uri.format());
34 }
35 const auto parsed = PersistentId::parse(uri.path());
36 if (!parsed || parsed->isNil()) {
37 return parseFailure<AssetRef>("asset URI path must be a non-nil canonical UUID", uri.format());
38 }
39 return Result<AssetRef>::success(AssetRef(*parsed));
40}
41
42std::string AssetRef::format() const { return std::string("asset://") + id_.format(); }
43
45 const auto logical = LogicalId::parse(text);
46 if (!logical) return parseFailure<DefinitionRef>("definition reference must be namespace:name", text);
48}
49
51 if (!id.isValid()) return parseFailure<DefinitionRef>("definition identity must be valid", {});
52 return Result<DefinitionRef>::success(DefinitionRef(std::move(id)));
53}
54
56 const auto parsed = PersistentId::parse(text);
57 if (!parsed || parsed->isNil()) return parseFailure<ObjectRef>("object reference must be a non-nil UUID", text);
59}
60
62 if (id.isNil()) return parseFailure<ObjectRef>("object identity must not be nil", {});
64}
65
68 if (!uri.ok()) return statusFailure<ResourceRef>(uri.status());
69 auto value = std::move(uri).takeValue();
70 if (value.scheme() == UriScheme::Asset) {
72 if (!asset.ok()) return statusFailure<ResourceRef>(asset.status());
73 return Result<ResourceRef>::success(ResourceRef(std::move(asset).takeValue()));
74 }
76}
77
79 if (std::holds_alternative<AssetRef>(value_)) return ResourceRefKind::Asset;
80 if (std::holds_alternative<ResourceUri>(value_)) return ResourceRefKind::Uri;
81 if (std::holds_alternative<DefinitionRef>(value_)) return ResourceRefKind::Definition;
83}
84
85const AssetRef* ResourceRef::asset() const noexcept { return std::get_if<AssetRef>(&value_); }
86
87const ResourceUri* ResourceRef::uri() const noexcept { return std::get_if<ResourceUri>(&value_); }
88
89const DefinitionRef* ResourceRef::definition() const noexcept { return std::get_if<DefinitionRef>(&value_); }
90
91const ObjectRef* ResourceRef::object() const noexcept { return std::get_if<ObjectRef>(&value_); }
92
93} // namespace eve
double value
std::string message
wgpu::PopErrorScopeStatus status
std::string text
std::string path
Definition PlayHost.cpp:110
std::string uri
Strong asset, definition, object and generic resource references.
Stable asset identity backed by PersistentId.
Definition ResourceRef.h:53
static Result< AssetRef > fromId(PersistentId id)
Build an asset reference from a non-nil persistent identity.
static Result< AssetRef > parse(std::string_view text)
Parse an asset://<canonical UUID> reference.
std::string format() const
Return canonical asset://<uuid> text.
static Result< AssetRef > fromUri(const ResourceUri &uri)
Convert an asset://<canonical UUID> ResourceUri to an AssetRef.
Stable definition reference backed by LogicalId.
Definition ResourceRef.h:85
DefinitionRef()=default
Constructs an invalid reference for optional/component storage.
static Result< DefinitionRef > parse(std::string_view text)
Parse a namespace:name logical definition identifier.
static Result< DefinitionRef > fromId(LogicalId id)
Build a definition reference from a valid LogicalId.
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
Human-readable, scoped identifier in the form namespace:name.
Definition Identity.h:411
static std::optional< LogicalId > parse(std::string_view text)
Parses a scoped logical name.
Definition Identity.cpp:36
Stable world/object identity backed by PersistentId.
static Result< ObjectRef > parse(std::string_view text)
Parse a canonical UUID text as an object reference.
static Result< ObjectRef > fromId(PersistentId id)
Build an object reference from a non-nil persistent identity.
Type-safe union of the reference forms accepted by resource-facing APIs.
const AssetRef * asset() const noexcept
Return the AssetRef when active, otherwise null.
const ObjectRef * object() const noexcept
Return the ObjectRef when active, otherwise null.
const ResourceUri * uri() const noexcept
Return the ResourceUri when active, otherwise null.
const DefinitionRef * definition() const noexcept
Return the DefinitionRef when active, otherwise null.
ResourceRefKind kind() const noexcept
Return the active reference kind.
static Result< ResourceRef > parse(std::string_view text)
Parse a resource URI, specializing asset://UUID as AssetRef.
A semantically named resource locator.
Definition Uri.h:101
static Result< ResourceUri > parse(std::string_view text)
Parse a supported resource URI.
Definition Uri.cpp:168
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
Id128 public API.
Definition Identity.h:112
std::string format() const
Formats the ID in lower-case canonical UUID text.
Definition Identity.h:173
static std::optional< Id128 > parse(std::string_view text) noexcept
Parses canonical UUID text.
Definition Identity.h:151
Build metadata (engine git commit, build time, third-party version).
Definition Build.cpp:16
ResourceRefKind
The alternative held by a generic ResourceRef.
Definition ResourceRef.h:22