summaryrefslogtreecommitdiff
path: root/deimos/core/status.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'deimos/core/status.cpp')
-rw-r--r--deimos/core/status.cpp30
1 files changed, 28 insertions, 2 deletions
diff --git a/deimos/core/status.cpp b/deimos/core/status.cpp
index f472aac..efdd6df 100644
--- a/deimos/core/status.cpp
+++ b/deimos/core/status.cpp
@@ -9,6 +9,18 @@ static deimos::AllocatorApi* allocator_api;
namespace deimos
{
+StringView StatusCodeToString(StatusCode code)
+{
+ switch (code)
+ {
+ case StatusCode::kOk: return StringView("OK");
+ case StatusCode::kUnknown: return StringView("Unknown error");
+ case StatusCode::kInvalidArgument: return StringView("Invalid argument");
+ case StatusCode::kUnimplemented: return StringView("Unimplemented");
+ case StatusCode::kInternal: return StringView("Internal error");
+ }
+}
+
struct StatusRep
{
Atomic<int32_t> ref_count;
@@ -18,9 +30,9 @@ struct StatusRep
Status::Status(StatusCode code, StringView message)
{
- if (code == StatusCode::kOk)
+ if (code == StatusCode::kOk || message.empty())
{
- m_rep = CodeToRep(StatusCode::kOk);
+ m_rep = CodeToRep(code);
}
else
{
@@ -74,6 +86,20 @@ void Status::Unref() const
}
}
+void Status::FormatStatus(IWriter* writer, const void* payload)
+{
+ const auto& status = *(const Status*)payload; // NOLINT
+ if (status.IsInline())
+ {
+ Format(writer, "[$]", StatusCodeToString(status.code()));
+ }
+ else
+ {
+ auto* rep = std::bit_cast<StatusRep*>(status.m_rep);
+ Format(writer, "[$: $]", StatusCodeToString(rep->code), rep->message);
+ }
+}
+
void InitializeStatus(ApiRegistry* api_registry)
{
allocator_api = api_registry->Get<AllocatorApi>();