From 98c8fd5d39ee645922f071b6433308a813245500 Mon Sep 17 00:00:00 2001 From: Steven Le Rouzic Date: Wed, 24 Apr 2024 00:29:16 +0200 Subject: Add custom formatter & use it on Status --- deimos/core/status.cpp | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'deimos/core/status.cpp') 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 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(status.m_rep); + Format(writer, "[$: $]", StatusCodeToString(rep->code), rep->message); + } +} + void InitializeStatus(ApiRegistry* api_registry) { allocator_api = api_registry->Get(); -- cgit