Added unknown stream error handling and fixed clang errors
This commit is contained in:
parent
3180c077a0
commit
f5bea15501
2 changed files with 27 additions and 4 deletions
|
@ -115,7 +115,7 @@ struct Config : V {
|
||||||
requires(!HasParse<T>)
|
requires(!HasParse<T>)
|
||||||
: V(AttributeConfig{}) {
|
: V(AttributeConfig{}) {
|
||||||
}
|
}
|
||||||
constexpr auto Base() const -> const V& {
|
[[nodiscard]] constexpr auto Base() const -> const V& {
|
||||||
return static_cast<const V&>(*this);
|
return static_cast<const V&>(*this);
|
||||||
}
|
}
|
||||||
using type = T;
|
using type = T;
|
||||||
|
|
|
@ -73,6 +73,25 @@ struct ErrorImpl : BaseError {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Helper class to prevent parsing response stream into an expected return type if its name is a 'stream:error'
|
||||||
|
struct UnknownXmppError : BaseError {
|
||||||
|
static constexpr auto kDefaultName = "stream:error";
|
||||||
|
static constexpr std::string_view kErrorMessage = "Unknown XMPP stream error";
|
||||||
|
|
||||||
|
static constexpr auto TryParse(xmlpp::Element* element) {
|
||||||
|
return std::optional{UnknownXmppError{}};
|
||||||
|
}
|
||||||
|
static constexpr auto Parse(xmlpp::Element* element) {
|
||||||
|
return TryParse(element).value();
|
||||||
|
}
|
||||||
|
friend constexpr auto operator<<(xmlpp::Element* element, const UnknownXmppError& obj) -> void {
|
||||||
|
throw std::format("'{}' must never be written into the real stream!", kErrorMessage);
|
||||||
|
}
|
||||||
|
[[nodiscard]] constexpr auto what() const noexcept -> const char* override {
|
||||||
|
return kErrorMessage.data();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct BadFormat : ErrorImpl<BadFormat> {};
|
struct BadFormat : ErrorImpl<BadFormat> {};
|
||||||
struct BadNamespacePrefix : ErrorImpl<BadNamespacePrefix> {};
|
struct BadNamespacePrefix : ErrorImpl<BadNamespacePrefix> {};
|
||||||
struct Conflict : ErrorImpl<Conflict> {};
|
struct Conflict : ErrorImpl<Conflict> {};
|
||||||
|
@ -81,7 +100,7 @@ struct HostGone : ErrorImpl<HostGone> {};
|
||||||
struct HostUnknown : ErrorImpl<HostUnknown> {};
|
struct HostUnknown : ErrorImpl<HostUnknown> {};
|
||||||
struct ImproperAdressing : ErrorImpl<ImproperAdressing> {};
|
struct ImproperAdressing : ErrorImpl<ImproperAdressing> {};
|
||||||
struct InternalServerError : ErrorImpl<InternalServerError> {};
|
struct InternalServerError : ErrorImpl<InternalServerError> {};
|
||||||
struct InvalidForm : ErrorImpl<InvalidForm> {};
|
struct InvalidFrom : ErrorImpl<InvalidFrom> {};
|
||||||
struct InvalidNamespace : ErrorImpl<InvalidNamespace> {};
|
struct InvalidNamespace : ErrorImpl<InvalidNamespace> {};
|
||||||
struct InvalidXml : ErrorImpl<InvalidXml> {};
|
struct InvalidXml : ErrorImpl<InvalidXml> {};
|
||||||
struct NotAuthorized : ErrorImpl<NotAuthorized> {};
|
struct NotAuthorized : ErrorImpl<NotAuthorized> {};
|
||||||
|
@ -109,7 +128,7 @@ using StreamError = std::variant<error::stream::BadFormat,
|
||||||
error::stream::HostUnknown,
|
error::stream::HostUnknown,
|
||||||
error::stream::ImproperAdressing,
|
error::stream::ImproperAdressing,
|
||||||
error::stream::InternalServerError,
|
error::stream::InternalServerError,
|
||||||
error::stream::InvalidForm,
|
error::stream::InvalidFrom,
|
||||||
error::stream::InvalidNamespace,
|
error::stream::InvalidNamespace,
|
||||||
error::stream::InvalidXml,
|
error::stream::InvalidXml,
|
||||||
error::stream::NotAuthorized,
|
error::stream::NotAuthorized,
|
||||||
|
@ -123,6 +142,10 @@ using StreamError = std::variant<error::stream::BadFormat,
|
||||||
error::stream::UnsupportedEncoding,
|
error::stream::UnsupportedEncoding,
|
||||||
error::stream::UnsupportedFeature,
|
error::stream::UnsupportedFeature,
|
||||||
error::stream::UnsupportedStanzaType,
|
error::stream::UnsupportedStanzaType,
|
||||||
error::stream::UnsupportedVersion>;
|
error::stream::UnsupportedVersion,
|
||||||
|
error::stream::UnknownXmppError>;
|
||||||
|
|
||||||
|
static_assert(!std::is_same_v<typename std::variant_alternative_t<std::variant_size_v<StreamError> - 1, StreamError>, StreamError>,
|
||||||
|
"'UnknownXmppError' must be at the end of 'StreamError' variant");
|
||||||
|
|
||||||
} // namespace larra::xmpp
|
} // namespace larra::xmpp
|
||||||
|
|
Loading…
Reference in a new issue