use std::{collections::BTreeMap, fmt, time::Duration};
use serde_json::Value as JsonValue;
use crate::{PrivOwnedStr, RoomVersionId};
#[derive(Clone, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum ErrorKind {
Forbidden,
UnknownToken {
soft_logout: bool,
},
MissingToken,
BadJson,
NotJson,
NotFound,
LimitExceeded {
retry_after_ms: Option<Duration>,
},
Unknown,
Unrecognized,
Unauthorized,
UserDeactivated,
UserInUse,
InvalidUsername,
RoomInUse,
InvalidRoomState,
ThreepidInUse,
ThreepidNotFound,
ThreepidAuthFailed,
ThreepidDenied,
ServerNotTrusted,
UnsupportedRoomVersion,
IncompatibleRoomVersion {
room_version: RoomVersionId,
},
BadState,
GuestAccessForbidden,
CaptchaNeeded,
CaptchaInvalid,
MissingParam,
InvalidParam,
TooLarge,
Exclusive,
ResourceLimitExceeded {
admin_contact: String,
},
CannotLeaveServerNoticeRoom,
WeakPassword,
UnableToAuthorizeJoin,
UnableToGrantJoin,
BadAlias,
DuplicateAnnotation,
NotYetUploaded,
CannotOverwriteMedia,
UnknownPos,
UrlNotSet,
BadStatus,
ConnectionFailed,
ConnectionTimeout,
WrongRoomKeysVersion {
current_version: Option<String>,
},
#[doc(hidden)]
_Custom {
errcode: PrivOwnedStr,
extra: BTreeMap<String, JsonValue>,
},
}
impl AsRef<str> for ErrorKind {
fn as_ref(&self) -> &str {
match self {
Self::Forbidden => "M_FORBIDDEN",
Self::UnknownToken { .. } => "M_UNKNOWN_TOKEN",
Self::MissingToken => "M_MISSING_TOKEN",
Self::BadJson => "M_BAD_JSON",
Self::NotJson => "M_NOT_JSON",
Self::NotFound => "M_NOT_FOUND",
Self::LimitExceeded { .. } => "M_LIMIT_EXCEEDED",
Self::Unknown => "M_UNKNOWN",
Self::Unrecognized => "M_UNRECOGNIZED",
Self::Unauthorized => "M_UNAUTHORIZED",
Self::UserDeactivated => "M_USER_DEACTIVATED",
Self::UserInUse => "M_USER_IN_USE",
Self::InvalidUsername => "M_INVALID_USERNAME",
Self::RoomInUse => "M_ROOM_IN_USE",
Self::InvalidRoomState => "M_INVALID_ROOM_STATE",
Self::ThreepidInUse => "M_THREEPID_IN_USE",
Self::ThreepidNotFound => "M_THREEPID_NOT_FOUND",
Self::ThreepidAuthFailed => "M_THREEPID_AUTH_FAILED",
Self::ThreepidDenied => "M_THREEPID_DENIED",
Self::ServerNotTrusted => "M_SERVER_NOT_TRUSTED",
Self::UnsupportedRoomVersion => "M_UNSUPPORTED_ROOM_VERSION",
Self::IncompatibleRoomVersion { .. } => "M_INCOMPATIBLE_ROOM_VERSION",
Self::BadState => "M_BAD_STATE",
Self::GuestAccessForbidden => "M_GUEST_ACCESS_FORBIDDEN",
Self::CaptchaNeeded => "M_CAPTCHA_NEEDED",
Self::CaptchaInvalid => "M_CAPTCHA_INVALID",
Self::MissingParam => "M_MISSING_PARAM",
Self::InvalidParam => "M_INVALID_PARAM",
Self::TooLarge => "M_TOO_LARGE",
Self::Exclusive => "M_EXCLUSIVE",
Self::ResourceLimitExceeded { .. } => "M_RESOURCE_LIMIT_EXCEEDED",
Self::CannotLeaveServerNoticeRoom => "M_CANNOT_LEAVE_SERVER_NOTICE_ROOM",
Self::WeakPassword => "M_WEAK_PASSWORD",
Self::UnableToAuthorizeJoin => "M_UNABLE_TO_AUTHORISE_JOIN",
Self::UnableToGrantJoin => "M_UNABLE_TO_GRANT_JOIN",
Self::BadAlias => "M_BAD_ALIAS",
Self::DuplicateAnnotation => "M_DUPLICATE_ANNOTATION",
Self::NotYetUploaded => "M_NOT_YET_UPLOADED",
Self::CannotOverwriteMedia => "M_CANNOT_OVERWRITE_MEDIA",
Self::UnknownPos => "M_UNKNOWN_POS",
Self::UrlNotSet => "M_URL_NOT_SET",
Self::BadStatus { .. } => "M_BAD_STATUS",
Self::ConnectionFailed => "M_CONNECTION_FAILED",
Self::ConnectionTimeout => "M_CONNECTION_TIMEOUT",
Self::WrongRoomKeysVersion { .. } => "M_WRONG_ROOM_KEYS_VERSION",
Self::_Custom { errcode, .. } => &errcode.0,
}
}
}
impl fmt::Display for ErrorKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.as_ref())
}
}