Skip to content

Commit

Permalink
Added status into shared library
Browse files Browse the repository at this point in the history
  • Loading branch information
GrigoriyPA committed Dec 10, 2024
1 parent d3f778d commit 692de3d
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 46 deletions.
16 changes: 11 additions & 5 deletions ydb/library/conclusion/generic/result.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once
#include <util/generic/singleton.h>
#include <util/generic/string.h>
#include <util/system/yassert.h>

#include <optional>
Expand Down Expand Up @@ -55,19 +56,19 @@ class TConclusionImpl {

const TResult& GetResult() const {
auto result = std::get_if<TResult>(&Result);
Y_ABORT_UNLESS(result, "incorrect object for result request");
Y_ABORT_UNLESS(result, "incorrect object for result request: %s", GetErrorString().data());
return *result;
}

TResult& MutableResult() {
auto result = std::get_if<TResult>(&Result);
Y_ABORT_UNLESS(result, "incorrect object for result request");
Y_ABORT_UNLESS(result, "incorrect object for result request: %s", GetErrorString().data());
return *result;
}

TResult&& DetachResult() {
auto result = std::get_if<TResult>(&Result);
Y_ABORT_UNLESS(result, "incorrect object for result request: %s", GetErrorMessage().data());
Y_ABORT_UNLESS(result, "incorrect object for result request: %s", GetErrorString().data());
return std::move(*result);
}

Expand All @@ -91,10 +92,15 @@ class TConclusionImpl {
return GetError();
}

const TString& GetErrorMessage() const {
TString GetErrorString() const {
auto* status = std::get_if<TStatus>(&Result);
return status ? status->GetErrorString() : Default<TString>();
}

const auto& GetErrorMessage() const {
auto* status = std::get_if<TStatus>(&Result);
if (!status) {
return Default<TString>();
return TStatus::Success().GetErrorMessage();
} else {
return status->GetErrorMessage();
}
Expand Down
142 changes: 101 additions & 41 deletions ydb/library/conclusion/generic/status.h
Original file line number Diff line number Diff line change
@@ -1,73 +1,60 @@
#pragma once

#include <yql/essentials/public/issue/yql_issue.h>

#include <util/generic/string.h>
#include <util/string/cast.h>
#include <util/system/yassert.h>

#include <optional>

namespace NKikimr {

template <class TStatus, TStatus StatusOk, TStatus DefaultError>
class TConclusionStatusImpl {
private:
std::optional<TString> ErrorMessage;
template <class TStatus, TStatus StatusOk, TStatus DefaultError, class TError, class TDerived>
class TConclusionStatusGenericImpl {
protected:
std::optional<TError> ErrorMessage;
TStatus Status = StatusOk;
TConclusionStatusImpl() = default;
TConclusionStatusImpl(const TString& errorMessage, TStatus status = DefaultError)
: ErrorMessage(errorMessage)
, Status(status) {
Y_ABORT_UNLESS(!!ErrorMessage);
}

TConclusionStatusImpl(const char* errorMessage, TStatus status = DefaultError)
: ErrorMessage(errorMessage)
TConclusionStatusGenericImpl() = default;

TConclusionStatusGenericImpl(const TError& error, TStatus status = DefaultError)
: ErrorMessage(error)
, Status(status) {
Y_ABORT_UNLESS(!!ErrorMessage);
}

TConclusionStatusImpl(const std::string& errorMessage, TStatus status = DefaultError)
: ErrorMessage(TString(errorMessage.data(), errorMessage.size()))
TConclusionStatusGenericImpl(TError&& error, TStatus status = DefaultError)
: ErrorMessage(std::move(error))
, Status(status) {
Y_ABORT_UNLESS(!!ErrorMessage);
}

public:
void Validate(const TString& processInfo = Default<TString>()) const {
if (processInfo) {
Y_ABORT_UNLESS(Ok(), "error=%s, processInfo=%s", GetErrorMessage().c_str(), processInfo.c_str());
} else {
Y_ABORT_UNLESS(Ok(), "error=%s", GetErrorMessage().c_str());
}
virtual ~TConclusionStatusGenericImpl() = default;

public:
[[nodiscard]] const TError& GetErrorMessage() const {
return ErrorMessage ? *ErrorMessage : Default<TError>();
}

[[nodiscard]] const TString& GetErrorMessage() const {
return ErrorMessage ? *ErrorMessage : Default<TString>();
[[nodiscard]] virtual TString GetErrorString() const {
return ErrorMessage ? ToString(*ErrorMessage) : Default<TString>();
}

[[nodiscard]] TStatus GetStatus() const {
return Status;
}

[[nodiscard]] static TConclusionStatusImpl Fail(const char* errorMessage) {
return TConclusionStatusImpl(errorMessage);
template <class TErrorMessage>
[[nodiscard]] static TDerived Fail(const TErrorMessage& errorMessage) {
return TDerived(errorMessage);
}

[[nodiscard]] static TConclusionStatusImpl Fail(const TString& errorMessage) {
return TConclusionStatusImpl(errorMessage);
}

[[nodiscard]] static TConclusionStatusImpl Fail(const std::string& errorMessage) {
return TConclusionStatusImpl(errorMessage);
}

[[nodiscard]] static TConclusionStatusImpl Fail(const TStatus& status, const char* errorMessage) {
template <class TErrorMessage>
[[nodiscard]] static TDerived Fail(const TStatus& status, const TErrorMessage& errorMessage) {
Y_ABORT_UNLESS(DefaultError == StatusOk || status != StatusOk);
return TConclusionStatusImpl(errorMessage, status);
}

[[nodiscard]] static TConclusionStatusImpl Fail(const TStatus& status, const TString& errorMessage) {
Y_ABORT_UNLESS(DefaultError == StatusOk || status != StatusOk);
return TConclusionStatusImpl(errorMessage, status);
return TDerived(errorMessage, status);
}

[[nodiscard]] bool IsFail() const {
Expand All @@ -86,8 +73,81 @@ class TConclusionStatusImpl {
return !!ErrorMessage;
}

[[nodiscard]] static TConclusionStatusImpl Success() {
return TConclusionStatusImpl();
[[nodiscard]] static TDerived Success() {
return TDerived();
}
};

template <class TStatus, TStatus StatusOk, TStatus DefaultError>
class TConclusionStatusImpl : public TConclusionStatusGenericImpl<TStatus, StatusOk, DefaultError, TString, TConclusionStatusImpl<TStatus, StatusOk, DefaultError>> {
protected:
friend class TConclusionStatusGenericImpl<TStatus, StatusOk, DefaultError, TString, TConclusionStatusImpl<TStatus, StatusOk, DefaultError>>;

using TBase = TConclusionStatusGenericImpl<TStatus, StatusOk, DefaultError, TString, TConclusionStatusImpl<TStatus, StatusOk, DefaultError>>;
using TBase::TBase;

TConclusionStatusImpl() = default;

TConclusionStatusImpl(const char* errorMessage, TStatus status = DefaultError)
: TBase(TString(errorMessage), status) {
}

TConclusionStatusImpl(const std::string& errorMessage, TStatus status = DefaultError)
: TBase(TString(errorMessage), status) {
}

public:
void Validate(const TString& processInfo = Default<TString>()) const {
if (processInfo) {
Y_ABORT_UNLESS(TBase::Ok(), "error=%s, processInfo=%s", TBase::GetErrorMessage().c_str(), processInfo.c_str());
} else {
Y_ABORT_UNLESS(TBase::Ok(), "error=%s", TBase::GetErrorMessage().c_str());
}
}
};

template <class TStatus, TStatus StatusOk, TStatus DefaultError>
class TConclusionStatusIssueImpl : public TConclusionStatusGenericImpl<TStatus, StatusOk, DefaultError, NYql::TIssues, TConclusionStatusIssueImpl<TStatus, StatusOk, DefaultError>> {
protected:
friend class TConclusionStatusGenericImpl<TStatus, StatusOk, DefaultError, NYql::TIssues, TConclusionStatusIssueImpl<TStatus, StatusOk, DefaultError>>;

using TBase = TConclusionStatusGenericImpl<TStatus, StatusOk, DefaultError, NYql::TIssues, TConclusionStatusIssueImpl<TStatus, StatusOk, DefaultError>>;
using TBase::TBase;

TConclusionStatusIssueImpl() = default;

TConclusionStatusIssueImpl(const TString& errorMessage, TStatus status = DefaultError)
: TBase({NYql::TIssue(errorMessage)}, status) {
}

public:
TConclusionStatusIssueImpl& AddParentIssue(NYql::TIssue issue) {
Y_ABORT_UNLESS(!!TBase::ErrorMessage);
for (const auto& childIssue : *TBase::ErrorMessage) {
issue.AddSubIssue(MakeIntrusive<NYql::TIssue>(childIssue));
}
TBase::ErrorMessage = {std::move(issue)};
return *this;
}

TConclusionStatusIssueImpl& AddParentIssue(const TString& message) {
AddParentIssue(NYql::TIssue(message));
return *this;
}

TConclusionStatusIssueImpl& AddIssue(NYql::TIssue issue) {
Y_ABORT_UNLESS(!!TBase::ErrorMessage);
TBase::ErrorMessage->AddIssue(std::move(issue));
return *this;
}

TConclusionStatusIssueImpl& AddIssue(const TString& message) {
AddIssue(NYql::TIssue(message));
return *this;
}

[[nodiscard]] virtual TString GetErrorString() const override {
return TBase::GetErrorMessage().ToOneLineString();
}
};

Expand Down
2 changes: 2 additions & 0 deletions ydb/library/conclusion/generic/ya.make
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ SRCS()

PEERDIR(
util

yql/essentials/public/issue
)

END()

0 comments on commit 692de3d

Please sign in to comment.