Skip to content

Commit d2b36a6

Browse files
committed
Added status into shared library
1 parent 456154d commit d2b36a6

File tree

3 files changed

+114
-46
lines changed

3 files changed

+114
-46
lines changed

ydb/library/conclusion/generic/result.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22
#include <util/generic/singleton.h>
3+
#include <util/generic/string.h>
34
#include <util/system/yassert.h>
45

56
#include <optional>
@@ -55,19 +56,19 @@ class TConclusionImpl {
5556

5657
const TResult& GetResult() const {
5758
auto result = std::get_if<TResult>(&Result);
58-
Y_ABORT_UNLESS(result, "incorrect object for result request");
59+
Y_ABORT_UNLESS(result, "incorrect object for result request: %s", GetErrorString().data());
5960
return *result;
6061
}
6162

6263
TResult& MutableResult() {
6364
auto result = std::get_if<TResult>(&Result);
64-
Y_ABORT_UNLESS(result, "incorrect object for result request");
65+
Y_ABORT_UNLESS(result, "incorrect object for result request: %s", GetErrorString().data());
6566
return *result;
6667
}
6768

6869
TResult&& DetachResult() {
6970
auto result = std::get_if<TResult>(&Result);
70-
Y_ABORT_UNLESS(result, "incorrect object for result request: %s", GetErrorMessage().data());
71+
Y_ABORT_UNLESS(result, "incorrect object for result request: %s", GetErrorString().data());
7172
return std::move(*result);
7273
}
7374

@@ -91,10 +92,15 @@ class TConclusionImpl {
9192
return GetError();
9293
}
9394

94-
const TString& GetErrorMessage() const {
95+
TString GetErrorString() const {
96+
auto* status = std::get_if<TStatus>(&Result);
97+
return status ? status->GetErrorString() : Default<TString>();
98+
}
99+
100+
const auto& GetErrorMessage() const {
95101
auto* status = std::get_if<TStatus>(&Result);
96102
if (!status) {
97-
return Default<TString>();
103+
return TStatus::Success().GetErrorMessage();
98104
} else {
99105
return status->GetErrorMessage();
100106
}

ydb/library/conclusion/generic/status.h

Lines changed: 101 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,60 @@
11
#pragma once
22

3+
#include <yql/essentials/public/issue/yql_issue.h>
4+
35
#include <util/generic/string.h>
6+
#include <util/string/cast.h>
47
#include <util/system/yassert.h>
58

69
#include <optional>
710

811
namespace NKikimr {
912

10-
template <class TStatus, TStatus StatusOk, TStatus DefaultError>
11-
class TConclusionStatusImpl {
12-
private:
13-
std::optional<TString> ErrorMessage;
13+
template <class TStatus, TStatus StatusOk, TStatus DefaultError, class TError, class TDerived>
14+
class TConclusionStatusGenericImpl {
15+
protected:
16+
std::optional<TError> ErrorMessage;
1417
TStatus Status = StatusOk;
15-
TConclusionStatusImpl() = default;
16-
TConclusionStatusImpl(const TString& errorMessage, TStatus status = DefaultError)
17-
: ErrorMessage(errorMessage)
18-
, Status(status) {
19-
Y_ABORT_UNLESS(!!ErrorMessage);
20-
}
2118

22-
TConclusionStatusImpl(const char* errorMessage, TStatus status = DefaultError)
23-
: ErrorMessage(errorMessage)
19+
TConclusionStatusGenericImpl() = default;
20+
21+
TConclusionStatusGenericImpl(const TError& error, TStatus status = DefaultError)
22+
: ErrorMessage(error)
2423
, Status(status) {
2524
Y_ABORT_UNLESS(!!ErrorMessage);
2625
}
2726

28-
TConclusionStatusImpl(const std::string& errorMessage, TStatus status = DefaultError)
29-
: ErrorMessage(TString(errorMessage.data(), errorMessage.size()))
27+
TConclusionStatusGenericImpl(TError&& error, TStatus status = DefaultError)
28+
: ErrorMessage(std::move(error))
3029
, Status(status) {
3130
Y_ABORT_UNLESS(!!ErrorMessage);
3231
}
3332

3433
public:
35-
void Validate(const TString& processInfo = Default<TString>()) const {
36-
if (processInfo) {
37-
Y_ABORT_UNLESS(Ok(), "error=%s, processInfo=%s", GetErrorMessage().c_str(), processInfo.c_str());
38-
} else {
39-
Y_ABORT_UNLESS(Ok(), "error=%s", GetErrorMessage().c_str());
40-
}
34+
virtual ~TConclusionStatusGenericImpl() = default;
35+
36+
public:
37+
[[nodiscard]] const TError& GetErrorMessage() const {
38+
return ErrorMessage ? *ErrorMessage : Default<TError>();
4139
}
4240

43-
[[nodiscard]] const TString& GetErrorMessage() const {
44-
return ErrorMessage ? *ErrorMessage : Default<TString>();
41+
[[nodiscard]] virtual TString GetErrorString() const {
42+
return ErrorMessage ? ToString(*ErrorMessage) : Default<TString>();
4543
}
4644

4745
[[nodiscard]] TStatus GetStatus() const {
4846
return Status;
4947
}
5048

51-
[[nodiscard]] static TConclusionStatusImpl Fail(const char* errorMessage) {
52-
return TConclusionStatusImpl(errorMessage);
49+
template <class TErrorMessage>
50+
[[nodiscard]] static TDerived Fail(const TErrorMessage& errorMessage) {
51+
return TDerived(errorMessage);
5352
}
5453

55-
[[nodiscard]] static TConclusionStatusImpl Fail(const TString& errorMessage) {
56-
return TConclusionStatusImpl(errorMessage);
57-
}
58-
59-
[[nodiscard]] static TConclusionStatusImpl Fail(const std::string& errorMessage) {
60-
return TConclusionStatusImpl(errorMessage);
61-
}
62-
63-
[[nodiscard]] static TConclusionStatusImpl Fail(const TStatus& status, const char* errorMessage) {
54+
template <class TErrorMessage>
55+
[[nodiscard]] static TDerived Fail(const TStatus& status, const TErrorMessage& errorMessage) {
6456
Y_ABORT_UNLESS(DefaultError == StatusOk || status != StatusOk);
65-
return TConclusionStatusImpl(errorMessage, status);
66-
}
67-
68-
[[nodiscard]] static TConclusionStatusImpl Fail(const TStatus& status, const TString& errorMessage) {
69-
Y_ABORT_UNLESS(DefaultError == StatusOk || status != StatusOk);
70-
return TConclusionStatusImpl(errorMessage, status);
57+
return TDerived(errorMessage, status);
7158
}
7259

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

89-
[[nodiscard]] static TConclusionStatusImpl Success() {
90-
return TConclusionStatusImpl();
76+
[[nodiscard]] static TDerived Success() {
77+
return TDerived();
78+
}
79+
};
80+
81+
template <class TStatus, TStatus StatusOk, TStatus DefaultError>
82+
class TConclusionStatusImpl : public TConclusionStatusGenericImpl<TStatus, StatusOk, DefaultError, TString, TConclusionStatusImpl<TStatus, StatusOk, DefaultError>> {
83+
protected:
84+
friend class TConclusionStatusGenericImpl<TStatus, StatusOk, DefaultError, TString, TConclusionStatusImpl<TStatus, StatusOk, DefaultError>>;
85+
86+
using TBase = TConclusionStatusGenericImpl<TStatus, StatusOk, DefaultError, TString, TConclusionStatusImpl<TStatus, StatusOk, DefaultError>>;
87+
using TBase::TBase;
88+
89+
TConclusionStatusImpl() = default;
90+
91+
TConclusionStatusImpl(const char* errorMessage, TStatus status = DefaultError)
92+
: TBase(TString(errorMessage), status) {
93+
}
94+
95+
TConclusionStatusImpl(const std::string& errorMessage, TStatus status = DefaultError)
96+
: TBase(TString(errorMessage), status) {
97+
}
98+
99+
public:
100+
void Validate(const TString& processInfo = Default<TString>()) const {
101+
if (processInfo) {
102+
Y_ABORT_UNLESS(TBase::Ok(), "error=%s, processInfo=%s", TBase::GetErrorMessage().c_str(), processInfo.c_str());
103+
} else {
104+
Y_ABORT_UNLESS(TBase::Ok(), "error=%s", TBase::GetErrorMessage().c_str());
105+
}
106+
}
107+
};
108+
109+
template <class TStatus, TStatus StatusOk, TStatus DefaultError>
110+
class TConclusionStatusIssueImpl : public TConclusionStatusGenericImpl<TStatus, StatusOk, DefaultError, NYql::TIssues, TConclusionStatusIssueImpl<TStatus, StatusOk, DefaultError>> {
111+
protected:
112+
friend class TConclusionStatusGenericImpl<TStatus, StatusOk, DefaultError, NYql::TIssues, TConclusionStatusIssueImpl<TStatus, StatusOk, DefaultError>>;
113+
114+
using TBase = TConclusionStatusGenericImpl<TStatus, StatusOk, DefaultError, NYql::TIssues, TConclusionStatusIssueImpl<TStatus, StatusOk, DefaultError>>;
115+
using TBase::TBase;
116+
117+
TConclusionStatusIssueImpl() = default;
118+
119+
TConclusionStatusIssueImpl(const TString& errorMessage, TStatus status = DefaultError)
120+
: TBase({NYql::TIssue(errorMessage)}, status) {
121+
}
122+
123+
public:
124+
TConclusionStatusIssueImpl& AddParentIssue(NYql::TIssue issue) {
125+
Y_ABORT_UNLESS(!!TBase::ErrorMessage);
126+
for (const auto& childIssue : *TBase::ErrorMessage) {
127+
issue.AddSubIssue(MakeIntrusive<NYql::TIssue>(childIssue));
128+
}
129+
TBase::ErrorMessage = {std::move(issue)};
130+
return *this;
131+
}
132+
133+
TConclusionStatusIssueImpl& AddParentIssue(const TString& message) {
134+
AddParentIssue(NYql::TIssue(message));
135+
return *this;
136+
}
137+
138+
TConclusionStatusIssueImpl& AddIssue(NYql::TIssue issue) {
139+
Y_ABORT_UNLESS(!!TBase::ErrorMessage);
140+
TBase::ErrorMessage->AddIssue(std::move(issue));
141+
return *this;
142+
}
143+
144+
TConclusionStatusIssueImpl& AddIssue(const TString& message) {
145+
AddIssue(NYql::TIssue(message));
146+
return *this;
147+
}
148+
149+
[[nodiscard]] virtual TString GetErrorString() const override {
150+
return TBase::GetErrorMessage().ToOneLineString();
91151
}
92152
};
93153

ydb/library/conclusion/generic/ya.make

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ SRCS()
44

55
PEERDIR(
66
util
7+
8+
yql/essentials/public/issue
79
)
810

911
END()

0 commit comments

Comments
 (0)