diff --git a/src/error.rs b/src/error.rs index 0a5ce361..efbe5d28 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,99 +1,131 @@ //! Errors that can be sent from the homeserver. +use std::fmt::{self, Display, Formatter}; + use ruma_api::{error::ResponseDeserializationError, EndpointError}; use serde::{Deserialize, Serialize}; +use strum::{AsRefStr, Display, EnumString}; /// An enum for the error kind. Items may contain additional information. -#[derive(Debug, Clone, Copy, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, Serialize, Deserialize, AsRefStr, Display, EnumString)] #[serde(tag = "errcode")] #[cfg_attr(test, derive(PartialEq))] pub enum ErrorKind { /// M_FORBIDDEN #[serde(rename = "M_FORBIDDEN")] + #[strum(to_string = "M_FORBIDDEN")] Forbidden, /// M_UNKNOWN_TOKEN #[serde(rename = "M_UNKNOWN_TOKEN")] + #[strum(to_string = "M_UNKNOWN_TOKEN")] UnknownToken, /// M_MISSING_TOKEN #[serde(rename = "M_MISSING_TOKEN")] + #[strum(to_string = "M_MISSING_TOKEN")] MissingToken, /// M_BAD_JSON #[serde(rename = "M_BAD_JSON")] + #[strum(to_string = "M_BAD_JSON")] BadJson, /// M_NOT_JSON #[serde(rename = "M_NOT_JSON")] + #[strum(to_string = "M_NOT_JSON")] NotJson, /// M_NOT_FOUND #[serde(rename = "M_NOT_FOUND")] + #[strum(to_string = "M_NOT_FOUND")] NotFound, /// M_LIMIT_EXCEEDED #[serde(rename = "M_LIMIT_EXCEEDED")] + #[strum(to_string = "M_LIMIT_EXCEEDED")] LimitExceeded, /// M_UNKNOWN #[serde(rename = "M_UNKNOWN")] + #[strum(to_string = "M_UNKNOWN")] Unknown, /// M_UNRECOGNIZED #[serde(rename = "M_UNRECOGNIZED")] + #[strum(to_string = "M_UNRECOGNIZED")] Unrecognized, /// M_UNAUTHORIZED #[serde(rename = "M_UNAUTHORIZED")] + #[strum(to_string = "M_UNAUTHORIZED")] Unauthorized, /// M_USER_IN_USE #[serde(rename = "M_USER_IN_USE")] + #[strum(to_string = "M_USER_IN_USE")] UserInUse, /// M_INVALID_USERNAME #[serde(rename = "M_INVALID_USERNAME")] + #[strum(to_string = "M_INVALID_USERNAME")] InvalidUsername, /// M_ROOM_IN_USE #[serde(rename = "M_ROOM_IN_USE")] + #[strum(to_string = "M_ROOM_IN_USE")] RoomInUse, /// M_INVALID_ROOM_STATE #[serde(rename = "M_INVALID_ROOM_STATE")] + #[strum(to_string = "M_INVALID_ROOM_STATE")] InvalidRoomState, /// M_THREEPID_IN_USE #[serde(rename = "M_THREEPID_IN_USE")] + #[strum(to_string = "M_THREEPID_IN_USE")] ThreepidInUse, /// M_THREEPID_NOT_FOUND #[serde(rename = "M_THREEPID_NOT_FOUND")] + #[strum(to_string = "M_THREEPID_NOT_FOUND")] ThreepidNotFound, /// M_THREEPID_AUTH_FAILED #[serde(rename = "M_THREEPID_AUTH_FAILED")] + #[strum(to_string = "M_THREEPID_AUTH_FAILED")] ThreepidAuthFailed, /// M_THREEPID_DENIED #[serde(rename = "M_THREEPID_DENIED")] + #[strum(to_string = "M_THREEPID_DENIED")] ThreepidDenied, /// M_SERVER_NOT_TRUSTED #[serde(rename = "M_SERVER_NOT_TRUSTED")] + #[strum(to_string = "M_SERVER_NOT_TRUSTED")] ServerNotTrusted, /// M_UNSUPPORTED_ROOM_VERSION #[serde(rename = "M_UNSUPPORTED_ROOM_VERSION")] + #[strum(to_string = "M_UNSUPPORTED_ROOM_VERSION")] UnsupportedRoomVersion, /// M_INCOMPATIBLE_ROOM_VERSION #[serde(rename = "M_INCOMPATIBLE_ROOM_VERSION")] + #[strum(to_string = "M_INCOMPATIBLE_ROOM_VERSION")] IncompatibleRoomVersion, /// M_BAD_STATE #[serde(rename = "M_BAD_STATE")] + #[strum(to_string = "M_BAD_STATE")] BadState, /// M_GUEST_ACCESS_FORBIDDEN #[serde(rename = "M_GUEST_ACCESS_FORBIDDEN")] + #[strum(to_string = "M_GUEST_ACCESS_FORBIDDEN")] GuestAccessForbidden, /// M_CAPTCHA_NEEDED #[serde(rename = "M_CAPTCHA_NEEDED")] + #[strum(to_string = "M_CAPTCHA_NEEDED")] CaptchaNeeded, /// M_CAPTCHA_INVALID #[serde(rename = "M_CAPTCHA_INVALID")] + #[strum(to_string = "M_CAPTCHA_INVALID")] CaptchaInvalid, /// M_MISSING_PARAM #[serde(rename = "M_MISSING_PARAM")] + #[strum(to_string = "M_MISSING_PARAM")] MissingParam, /// M_INVALID_PARAM #[serde(rename = "M_INVALID_PARAM")] + #[strum(to_string = "M_INVALID_PARAM")] InvalidParam, /// M_TOO_LARGE #[serde(rename = "M_TOO_LARGE")] + #[strum(to_string = "M_TOO_LARGE")] TooLarge, /// M_EXCLUSIVE #[serde(rename = "M_EXCLUSIVE")] + #[strum(to_string = "M_EXCLUSIVE")] Exclusive, } @@ -131,6 +163,20 @@ impl EndpointError for Error { } } +impl Display for Error { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + write!( + f, + "[{} / {}] {}", + self.status_code.as_u16(), + self.kind, + self.message + ) + } +} + +impl std::error::Error for Error {} + impl From for ErrorBody { fn from(error: Error) -> Self { Self {