Commit 43981017 authored by Max Kellermann's avatar Max Kellermann

input/tidal: parse subStatus in error responses

parent 2e1481f4
...@@ -33,15 +33,25 @@ class TidalError : public std::runtime_error { ...@@ -33,15 +33,25 @@ class TidalError : public std::runtime_error {
*/ */
unsigned status; unsigned status;
/**
* The Tidal-specific "subStatus". 0 if none was found in the
* JSON response.
*/
unsigned sub_status;
public: public:
template<typename W> template<typename W>
TidalError(unsigned _status, W &&_what) noexcept TidalError(unsigned _status, unsigned _sub_status, W &&_what) noexcept
:std::runtime_error(std::forward<W>(_what)), :std::runtime_error(std::forward<W>(_what)),
status(_status) {} status(_status), sub_status(_sub_status) {}
unsigned GetStatus() const noexcept { unsigned GetStatus() const noexcept {
return status; return status;
} }
unsigned GetSubStatus() const noexcept {
return sub_status;
}
}; };
#endif #endif
...@@ -28,7 +28,7 @@ using Wrapper = Yajl::CallbacksWrapper<TidalErrorParser>; ...@@ -28,7 +28,7 @@ using Wrapper = Yajl::CallbacksWrapper<TidalErrorParser>;
static constexpr yajl_callbacks tidal_error_parser_callbacks = { static constexpr yajl_callbacks tidal_error_parser_callbacks = {
nullptr, nullptr,
nullptr, nullptr,
nullptr, Wrapper::Integer,
nullptr, nullptr,
nullptr, nullptr,
Wrapper::String, Wrapper::String,
...@@ -62,7 +62,23 @@ TidalErrorParser::OnEnd() ...@@ -62,7 +62,23 @@ TidalErrorParser::OnEnd()
else else
snprintf(what, sizeof(what), "Status %u from Tidal", status); snprintf(what, sizeof(what), "Status %u from Tidal", status);
throw TidalError(status, what); throw TidalError(status, sub_status, what);
}
inline bool
TidalErrorParser::Integer(long long value) noexcept
{
switch (state) {
case State::NONE:
case State::USER_MESSAGE:
break;
case State::SUB_STATUS:
sub_status = value;
break;
}
return true;
} }
inline bool inline bool
...@@ -70,6 +86,7 @@ TidalErrorParser::String(StringView value) noexcept ...@@ -70,6 +86,7 @@ TidalErrorParser::String(StringView value) noexcept
{ {
switch (state) { switch (state) {
case State::NONE: case State::NONE:
case State::SUB_STATUS:
break; break;
case State::USER_MESSAGE: case State::USER_MESSAGE:
...@@ -85,6 +102,8 @@ TidalErrorParser::MapKey(StringView value) noexcept ...@@ -85,6 +102,8 @@ TidalErrorParser::MapKey(StringView value) noexcept
{ {
if (value.Equals("userMessage")) if (value.Equals("userMessage"))
state = State::USER_MESSAGE; state = State::USER_MESSAGE;
else if (value.Equals("subStatus"))
state = State::SUB_STATUS;
else else
state = State::NONE; state = State::NONE;
......
...@@ -39,8 +39,11 @@ class TidalErrorParser final : public YajlResponseParser { ...@@ -39,8 +39,11 @@ class TidalErrorParser final : public YajlResponseParser {
enum class State { enum class State {
NONE, NONE,
USER_MESSAGE, USER_MESSAGE,
SUB_STATUS,
} state = State::NONE; } state = State::NONE;
unsigned sub_status = 0;
std::string message; std::string message;
public: public:
...@@ -57,6 +60,7 @@ protected: ...@@ -57,6 +60,7 @@ protected:
public: public:
/* yajl callbacks */ /* yajl callbacks */
bool Integer(long long value) noexcept;
bool String(StringView value) noexcept; bool String(StringView value) noexcept;
bool MapKey(StringView value) noexcept; bool MapKey(StringView value) noexcept;
bool EndMap() noexcept; bool EndMap() noexcept;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment