1use std::{collections::BTreeMap, fmt, time::Duration};
4
5use serde_json::Value as JsonValue;
6
7use crate::{PrivOwnedStr, RoomVersionId};
8
9#[derive(Clone, Debug, PartialEq, Eq)]
13#[non_exhaustive]
14pub enum ErrorKind {
15 Forbidden,
17
18 UnknownToken {
20 soft_logout: bool,
27 },
28
29 MissingToken,
31
32 BadJson,
34
35 NotJson,
37
38 NotFound,
40
41 LimitExceeded {
43 retry_after_ms: Option<Duration>,
45 },
46
47 Unknown,
49
50 Unrecognized,
52
53 Unauthorized,
55
56 UserDeactivated,
58
59 UserInUse,
61
62 InvalidUsername,
64
65 RoomInUse,
67
68 InvalidRoomState,
70
71 ThreepidInUse,
73
74 ThreepidNotFound,
76
77 ThreepidAuthFailed,
79
80 ThreepidDenied,
82
83 ServerNotTrusted,
85
86 UnsupportedRoomVersion,
88
89 IncompatibleRoomVersion {
91 room_version: RoomVersionId,
93 },
94
95 BadState,
97
98 GuestAccessForbidden,
100
101 CaptchaNeeded,
103
104 CaptchaInvalid,
106
107 MissingParam,
109
110 InvalidParam,
112
113 TooLarge,
115
116 Exclusive,
118
119 ResourceLimitExceeded {
121 admin_contact: String,
123 },
124
125 CannotLeaveServerNoticeRoom,
127
128 WeakPassword,
130
131 UnableToAuthorizeJoin,
133
134 UnableToGrantJoin,
136
137 BadAlias,
139
140 DuplicateAnnotation,
142
143 NotYetUploaded,
145
146 CannotOverwriteMedia,
148
149 UnknownPos,
151
152 UrlNotSet,
154
155 BadStatus,
157
158 ConnectionFailed,
160
161 ConnectionTimeout,
163
164 WrongRoomKeysVersion {
166 current_version: Option<String>,
168 },
169
170 #[doc(hidden)]
171 _Custom {
172 errcode: PrivOwnedStr,
173 extra: BTreeMap<String, JsonValue>,
174 },
175}
176
177impl AsRef<str> for ErrorKind {
178 fn as_ref(&self) -> &str {
179 match self {
180 Self::Forbidden => "M_FORBIDDEN",
181 Self::UnknownToken { .. } => "M_UNKNOWN_TOKEN",
182 Self::MissingToken => "M_MISSING_TOKEN",
183 Self::BadJson => "M_BAD_JSON",
184 Self::NotJson => "M_NOT_JSON",
185 Self::NotFound => "M_NOT_FOUND",
186 Self::LimitExceeded { .. } => "M_LIMIT_EXCEEDED",
187 Self::Unknown => "M_UNKNOWN",
188 Self::Unrecognized => "M_UNRECOGNIZED",
189 Self::Unauthorized => "M_UNAUTHORIZED",
190 Self::UserDeactivated => "M_USER_DEACTIVATED",
191 Self::UserInUse => "M_USER_IN_USE",
192 Self::InvalidUsername => "M_INVALID_USERNAME",
193 Self::RoomInUse => "M_ROOM_IN_USE",
194 Self::InvalidRoomState => "M_INVALID_ROOM_STATE",
195 Self::ThreepidInUse => "M_THREEPID_IN_USE",
196 Self::ThreepidNotFound => "M_THREEPID_NOT_FOUND",
197 Self::ThreepidAuthFailed => "M_THREEPID_AUTH_FAILED",
198 Self::ThreepidDenied => "M_THREEPID_DENIED",
199 Self::ServerNotTrusted => "M_SERVER_NOT_TRUSTED",
200 Self::UnsupportedRoomVersion => "M_UNSUPPORTED_ROOM_VERSION",
201 Self::IncompatibleRoomVersion { .. } => "M_INCOMPATIBLE_ROOM_VERSION",
202 Self::BadState => "M_BAD_STATE",
203 Self::GuestAccessForbidden => "M_GUEST_ACCESS_FORBIDDEN",
204 Self::CaptchaNeeded => "M_CAPTCHA_NEEDED",
205 Self::CaptchaInvalid => "M_CAPTCHA_INVALID",
206 Self::MissingParam => "M_MISSING_PARAM",
207 Self::InvalidParam => "M_INVALID_PARAM",
208 Self::TooLarge => "M_TOO_LARGE",
209 Self::Exclusive => "M_EXCLUSIVE",
210 Self::ResourceLimitExceeded { .. } => "M_RESOURCE_LIMIT_EXCEEDED",
211 Self::CannotLeaveServerNoticeRoom => "M_CANNOT_LEAVE_SERVER_NOTICE_ROOM",
212 Self::WeakPassword => "M_WEAK_PASSWORD",
213 Self::UnableToAuthorizeJoin => "M_UNABLE_TO_AUTHORISE_JOIN",
214 Self::UnableToGrantJoin => "M_UNABLE_TO_GRANT_JOIN",
215 Self::BadAlias => "M_BAD_ALIAS",
216 Self::DuplicateAnnotation => "M_DUPLICATE_ANNOTATION",
217 Self::NotYetUploaded => "M_NOT_YET_UPLOADED",
218 Self::CannotOverwriteMedia => "M_CANNOT_OVERWRITE_MEDIA",
219 Self::UnknownPos => "M_UNKNOWN_POS",
220 Self::UrlNotSet => "M_URL_NOT_SET",
221 Self::BadStatus { .. } => "M_BAD_STATUS",
222 Self::ConnectionFailed => "M_CONNECTION_FAILED",
223 Self::ConnectionTimeout => "M_CONNECTION_TIMEOUT",
224 Self::WrongRoomKeysVersion { .. } => "M_WRONG_ROOM_KEYS_VERSION",
225 Self::_Custom { errcode, .. } => &errcode.0,
226 }
227 }
228}
229
230impl fmt::Display for ErrorKind {
231 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
232 write!(f, "{}", self.as_ref())
233 }
234}