xrpld
Loading...
Searching...
No Matches
Status.h
1#pragma once
2
3#include <xrpl/beast/utility/instrumentation.h>
4#include <xrpl/protocol/ErrorCodes.h>
5#include <xrpl/protocol/TER.h>
6
7namespace xrpl::RPC {
8
18struct Status : public std::exception
19{
20public:
21 enum class Type { None, TER, ErrorCodeI };
22 using Code = int;
24
25 static constexpr Code kOK = 0;
26
27 Status() = default;
28
29 // The enable_if allows only integers (not enums). Prevents enum narrowing.
30 template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
31 Status(T code, Strings d = {}) : code_(code), messages_(std::move(d))
32 {
33 }
34
35 Status(TER ter, Strings d = {})
36 : type_(Type::TER), code_(TERtoInt(ter)), messages_(std::move(d))
37 {
38 }
39
41 : type_(Type::ErrorCodeI), code_(e), messages_(std::move(d))
42 {
43 }
44
46 {
47 }
48
49 /* Returns a representation of the integer status Code as a string.
50 If the Status is OK, the result is an empty string.
51 */
52 [[nodiscard]] std::string
53 codeString() const;
54
56 operator bool() const
57 {
58 return code_ != kOK;
59 }
60
62 bool
63 operator!() const
64 {
65 return !bool(*this);
66 }
67
70 [[nodiscard]] TER
71 toTER() const
72 {
73 XRPL_ASSERT(type_ == Type::TER, "xrpl::RPC::Status::toTER : type is TER");
74 return TER::fromInt(code_);
75 }
76
79 [[nodiscard]] ErrorCodeI
81 {
82 XRPL_ASSERT(type_ == Type::ErrorCodeI, "xrpl::RPC::Status::toTER : type is error code");
83 return ErrorCodeI(code_);
84 }
85
88 void
89 inject(json::Value& object) const
90 {
91 if (auto ec = toErrorCode())
92 {
93 if (messages_.empty())
94 {
95 injectError(ec, object);
96 }
97 else
98 {
99 injectError(ec, message(), object);
100 }
101 }
102 }
103
104 [[nodiscard]] Strings const&
105 messages() const
106 {
107 return messages_;
108 }
109
111 [[nodiscard]] std::string
112 message() const;
113
114 [[nodiscard]] Type
115 type() const
116 {
117 return type_;
118 }
119
120 [[nodiscard]] std::string
121 toString() const;
122
126 void
128
129private:
133};
134
135} // namespace xrpl::RPC
Represents a JSON value.
Definition json_value.h:130
static constexpr TERSubset fromInt(int from)
Definition TER.h:431
STL namespace.
API version numbers used in later API versions.
Definition ApiVersion.h:35
void injectError(ErrorCodeI code, json::Value &json)
Add or update the json update to reflect the error code.
ErrorCodeI
Definition ErrorCodes.h:22
constexpr TERUnderlyingType TERtoInt(TELcodes v)
Definition TER.h:373
TERSubset< CanCvtToTER > TER
Definition TER.h:634
Strings const & messages() const
Definition Status.h:105
Status(TER ter, Strings d={})
Definition Status.h:35
std::string message() const
Return the first message, if any.
Definition Status.cpp:67
std::string codeString() const
Definition Status.cpp:15
std::vector< std::string > Strings
Definition Status.h:23
Status(T code, Strings d={})
Definition Status.h:31
Status(ErrorCodeI e, Strings d={})
Definition Status.h:40
TER toTER() const
Returns the Status as a TER.
Definition Status.h:71
bool operator!() const
Returns true if the Status is OK.
Definition Status.h:63
static constexpr Code kOK
Definition Status.h:25
void fillJson(json::Value &)
Fill a json::Value with an RPC 2.0 response.
Definition Status.cpp:48
Type type() const
Definition Status.h:115
Status(ErrorCodeI e, std::string const &s)
Definition Status.h:45
Strings messages_
Definition Status.h:132
void inject(json::Value &object) const
Apply the Status to a JsonObject.
Definition Status.h:89
ErrorCodeI toErrorCode() const
Returns the Status as an error_code_i.
Definition Status.h:80
std::string toString() const
Definition Status.cpp:81