1
1
#pragma once
2
2
3
+ #include < yql/essentials/public/issue/yql_issue.h>
4
+
3
5
#include < util/generic/string.h>
6
+ #include < util/string/cast.h>
4
7
#include < util/system/yassert.h>
5
8
6
9
#include < optional>
7
10
8
11
namespace NKikimr {
9
12
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;
14
17
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
- }
21
18
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)
24
23
, Status(status) {
25
24
Y_ABORT_UNLESS (!!ErrorMessage);
26
25
}
27
26
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 ))
30
29
, Status(status) {
31
30
Y_ABORT_UNLESS (!!ErrorMessage);
32
31
}
33
32
34
33
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>();
41
39
}
42
40
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>();
45
43
}
46
44
47
45
[[nodiscard]] TStatus GetStatus () const {
48
46
return Status;
49
47
}
50
48
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);
53
52
}
54
53
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) {
64
56
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);
71
58
}
72
59
73
60
[[nodiscard]] bool IsFail () const {
@@ -86,8 +73,81 @@ class TConclusionStatusImpl {
86
73
return !!ErrorMessage;
87
74
}
88
75
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 ();
91
151
}
92
152
};
93
153
0 commit comments