From dffe376aeb2a71b15d5732c8c2835556d3e3abf4 Mon Sep 17 00:00:00 2001 From: timokoesters Date: Sun, 16 Feb 2020 13:00:54 +0100 Subject: [PATCH] feat: add MatrixError struct --- Cargo.toml | 1 + src/error.rs | 148 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 3 files changed, 150 insertions(+) create mode 100644 src/error.rs diff --git a/Cargo.toml b/Cargo.toml index f8a89317..349f9759 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,3 +20,4 @@ ruma-identifiers = "0.14.1" serde = { version = "1.0.104", features = ["derive"] } serde_json = "1.0.47" url = { version = "2.1.1", features = ["serde"] } +http = "0.2.0" diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 00000000..b7569d4d --- /dev/null +++ b/src/error.rs @@ -0,0 +1,148 @@ +//! Errors that can be sent from the homeserver. + +use serde::{Deserialize, Serialize}; + +/// An enum for the error kind. Items may contain additional information. +#[derive(Debug, Clone, Copy, Serialize, Deserialize)] +#[serde(tag = "errcode")] +pub enum ErrorKind { + /// M_FORBIDDEN + #[serde(rename = "M_FORBIDDEN")] + Forbidden, + /// M_UNKNOWN_TOKEN + #[serde(rename = "M_UNKNOWN_TOKEN")] + UnknownToken, + /// M_MISSING_TOKEN + #[serde(rename = "M_MISSING_TOKEN")] + MissingToken, + /// M_BAD_JSON + #[serde(rename = "M_BAD_JSON")] + BadJson, + /// M_NOT_JSON + #[serde(rename = "M_NOT_JSON")] + NotJson, + /// M_NOT_FOUND + #[serde(rename = "M_NOT_FOUND")] + NotFound, + /// M_LIMIT_EXCEEDED + #[serde(rename = "M_LIMIT_EXCEEDED")] + LimitExceeded, + /// M_UNKNOWN + #[serde(rename = "M_UNKNOWN")] + Unknown, + /// M_UNRECOGNIZED + #[serde(rename = "M_UNRECOGNIZED")] + Unrecognized, + /// M_UNAUTHORIZED + #[serde(rename = "M_UNAUTHORIZED")] + Unauthorized, + /// M_USER_IN_USE + #[serde(rename = "M_USER_IN_USE")] + UserInUse, + /// M_INVALID_USERNAME + #[serde(rename = "M_INVALID_USERNAME")] + InvalidUsername, + /// M_ROOM_IN_USE + #[serde(rename = "M_ROOM_IN_USE")] + RoomInUse, + /// M_INVALID_ROOM_STATE + #[serde(rename = "M_INVALID_ROOM_STATE")] + InvalidRoomState, + /// M_THREEPID_IN_USE + #[serde(rename = "M_THREEPID_IN_USE")] + ThreepidInUse, + /// M_THREEPID_NOT_FOUND + #[serde(rename = "M_THREEPID_NOT_FOUND")] + ThreepidNotFound, + /// M_THREEPID_AUTH_FAILED + #[serde(rename = "M_THREEPID_AUTH_FAILED")] + ThreepidAuthFailed, + /// M_THREEPID_DENIED + #[serde(rename = "M_THREEPID_DENIED")] + ThreepidDenied, + /// M_SERVER_NOT_TRUSTED + #[serde(rename = "M_SERVER_NOT_TRUSTED")] + ServerNotTrusted, + /// M_UNSUPPORTED_ROOM_VERSION + #[serde(rename = "M_UNSUPPORTED_ROOM_VERSION")] + UnsupportedRoomVersion, + /// M_INCOMPATIBLE_ROOM_VERSION + #[serde(rename = "M_INCOMPATIBLE_ROOM_VERSION")] + IncompatibleRoomVersion, + /// M_BAD_STATE + #[serde(rename = "M_BAD_STATE")] + BadState, + /// M_GUEST_ACCESS_FORBIDDEN + #[serde(rename = "M_GUEST_ACCESS_FORBIDDEN")] + GuestAccessForbidden, + /// M_CAPTCHA_NEEDED + #[serde(rename = "M_CAPTCHA_NEEDED")] + CaptchaNeeded, + /// M_CAPTCHA_INVALID + #[serde(rename = "M_CAPTCHA_INVALID")] + CaptchaInvalid, + /// M_MISSING_PARAM + #[serde(rename = "M_MISSING_PARAM")] + MissingParam, + /// M_INVALID_PARAM + #[serde(rename = "M_INVALID_PARAM")] + InvalidParam, + /// M_TOO_LARGE + #[serde(rename = "M_TOO_LARGE")] + TooLarge, + /// M_EXCLUSIVE + #[serde(rename = "M_EXCLUSIVE")] + Exclusive, +} + +/// A Matrix Error without a status code +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct ErrorBody { + /// A value which can be used to handle an error message + #[serde(flatten)] + pub kind: ErrorKind, + /// A human-readable error message, usually a sentence explaining what went wrong. + #[serde(rename = "error")] + pub message: String, +} + +/// A Matrix Error +#[derive(Debug, Clone)] +pub struct Error { + /// A value which can be used to handle an error message + pub kind: ErrorKind, + /// A human-readable error message, usually a sentence explaining what went wrong. + pub message: String, + /// The http status code + pub status_code: http::StatusCode, +} + +impl From for ErrorBody { + fn from(error: Error) -> Self { + Self { + kind: error.kind, + message: error.message, + } + } +} + +impl ErrorBody { + /// Convert the ErrorBody into an Error by adding the http status code. + pub fn into_error(self, status_code: http::StatusCode) -> Error { + Error { + kind: self.kind, + message: self.message, + status_code, + } + } +} + +impl From for http::Response> { + fn from(error: Error) -> http::Response> { + http::Response::builder() + .header(http::header::CONTENT_TYPE, "application/json") + .status(error.status_code) + .body(serde_json::to_vec(&ErrorBody::from(error)).unwrap()) + .unwrap() + } +} diff --git a/src/lib.rs b/src/lib.rs index eb2423c6..4b08448a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,5 +8,6 @@ missing_docs )] +pub mod error; pub mod r0; pub mod unversioned;