xrpld
Loading...
Searching...
No Matches
Status.h
1#pragma once
2
3#include <xrpl/beast/utility/instrumentation.h>
4#include <xrpl/json/json_value.h>
5#include <xrpl/protocol/ErrorCodes.h>
6#include <xrpl/protocol/TER.h>
7
8#include <exception>
9#include <string>
10#include <type_traits>
11#include <utility>
12#include <vector>
13
14namespace xrpl::rpc {
15
26struct Status : public std::exception
27{
28public:
29 enum class Type { None, TER, ErrorCodeI };
30 using Code = int;
32
33 static constexpr Code kOK = 0;
34
35 Status() = default;
36
37 // The constraint allows only integers (not enums). Prevents enum narrowing.
38 template <typename T>
39 Status(T code, Strings d = {})
40 requires(std::is_integral_v<T>)
41 : code_(code), messages_(std::move(d))
42 {
43 }
44
45 Status(TER ter, Strings d = {})
46 : type_(Type::TER), code_(TERtoInt(ter)), messages_(std::move(d))
47 {
48 }
49
51 : type_(Type::ErrorCodeI), code_(e), messages_(std::move(d))
52 {
53 }
54
56 {
57 }
58
64 [[nodiscard]] std::string
65 codeString() const;
66
70 operator bool() const
71 {
72 return code_ != kOK;
73 }
74
78 bool
79 operator!() const
80 {
81 return !bool(*this);
82 }
83
88 [[nodiscard]] TER
89 toTER() const
90 {
91 XRPL_ASSERT(type_ == Type::TER, "xrpl::rpc::Status::toTER : type is TER");
92 return TER::fromInt(code_);
93 }
94
99 [[nodiscard]] ErrorCodeI
101 {
102 XRPL_ASSERT(
103 type_ == Type::ErrorCodeI, "xrpl::rpc::Status::toErrorCode : type is error code");
104 return ErrorCodeI(code_);
105 }
106
110 void
111 inject(json::Value& object) const
112 {
113 if (auto ec = toErrorCode())
114 {
115 if (messages_.empty())
116 {
117 injectError(ec, object);
118 }
119 else
120 {
121 injectError(ec, message(), object);
122 }
123 }
124 }
125
126 [[nodiscard]] Strings const&
127 messages() const
128 {
129 return messages_;
130 }
131
135 [[nodiscard]] std::string
136 message() const;
137
138 [[nodiscard]] Type
139 type() const
140 {
141 return type_;
142 }
143
144 [[nodiscard]] std::string
145 toString() const;
146
152 void
154
155private:
159};
160
161} // namespace xrpl::rpc
Represents a JSON value.
Definition json_value.h:117
static constexpr TERSubset fromInt(int from)
Definition TER.h:437
T is_integral_v
STL namespace.
API version numbers used in later API versions.
Definition ApiVersion.h:36
void injectError(ErrorCodeI code, json::Value &json)
Add or update the json update to reflect the error code.
ErrorCodeI
Definition ErrorCodes.h:23
constexpr TERUnderlyingType TERtoInt(TELcodes v)
Definition TER.h:379
TERSubset< CanCvtToTER > TER
Definition TER.h:647
Status(ErrorCodeI e, std::string const &s)
Definition Status.h:55
void inject(json::Value &object) const
Apply the Status to a JsonObject.
Definition Status.h:111
Status(T code, Strings d={})
Definition Status.h:39
TER toTER() const
Returns the Status as a TER.
Definition Status.h:89
Strings messages_
Definition Status.h:158
std::vector< std::string > Strings
Definition Status.h:31
ErrorCodeI toErrorCode() const
Returns the Status as an error_code_i.
Definition Status.h:100
void fillJson(json::Value &)
Fill a json::Value with an RPC 2.0 response.
Definition Status.cpp:48
std::string toString() const
Definition Status.cpp:81
Status(ErrorCodeI e, Strings d={})
Definition Status.h:50
Strings const & messages() const
Definition Status.h:127
Status(TER ter, Strings d={})
Definition Status.h:45
static constexpr Code kOK
Definition Status.h:33
std::string codeString() const
If the Status is OK, the result is an empty string.
Definition Status.cpp:15
Type type() const
Definition Status.h:139
bool operator!() const
Returns true if the Status is OK.
Definition Status.h:79
std::string message() const
Return the first message, if any.
Definition Status.cpp:67