From 66cecdac6b4573edab85f482c9c34ad8bfbdd4ca Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Mon, 27 Apr 2020 22:53:36 +0200 Subject: [PATCH] Move error types into a dedicated error module --- src/error.rs | 74 ++++++++++++++++++++++++++++++++++++++++++++++++ src/json.rs | 5 +++- src/lib.rs | 79 ++-------------------------------------------------- 3 files changed, 81 insertions(+), 77 deletions(-) create mode 100644 src/error.rs diff --git a/src/error.rs b/src/error.rs new file mode 100644 index 00000000..56b5b0b9 --- /dev/null +++ b/src/error.rs @@ -0,0 +1,74 @@ +use std::{ + error::Error, + fmt::{self, Display, Formatter}, +}; + +/// An event that is malformed or otherwise invalid. +/// +/// When attempting to deserialize an [`EventJson`](enum.EventJson.html), an error in the input +/// data may cause deserialization to fail, or the JSON structure may be correct, but additional +/// constraints defined in the matrix specification are not upheld. This type provides an error +/// message and a flag for which type of error was encountered. +#[derive(Clone, Debug)] +pub struct InvalidEvent { + pub(crate) message: String, + pub(crate) kind: InvalidEventKind, +} + +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub enum InvalidEventKind { + Deserialization, + Validation, +} + +impl InvalidEvent { + /// A message describing why the event is invalid. + pub fn message(&self) -> String { + self.message.clone() + } + + /// Returns whether this is a deserialization error. + pub fn is_deserialization(&self) -> bool { + self.kind == InvalidEventKind::Deserialization + } + + /// Returns whether this is a validation error. + pub fn is_validation(&self) -> bool { + self.kind == InvalidEventKind::Validation + } +} + +impl Display for InvalidEvent { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.message()) + } +} + +impl Error for InvalidEvent {} + +/// An error returned when attempting to create an event with data that would make it invalid. +/// +/// This type is similar to [`InvalidEvent`](struct.InvalidEvent.html), but used during the +/// construction of a new event, as opposed to deserialization of an existing event from JSON. +#[derive(Clone, Debug, PartialEq)] +pub struct InvalidInput(pub(crate) String); + +impl Display for InvalidInput { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "{}", self.0) + } +} + +impl Error for InvalidInput {} + +/// An error when attempting to create a value from a string via the `FromStr` trait. +#[derive(Clone, Copy, Eq, Debug, Hash, PartialEq)] +pub struct FromStrError; + +impl Display for FromStrError { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!(f, "failed to parse type from string") + } +} + +impl Error for FromStrError {} diff --git a/src/json.rs b/src/json.rs index bc750024..e097199e 100644 --- a/src/json.rs +++ b/src/json.rs @@ -10,7 +10,10 @@ use serde::{ }; use serde_json::value::RawValue; -use crate::{InvalidEvent, InvalidEventKind, TryFromRaw}; +use crate::{ + error::{InvalidEvent, InvalidEventKind}, + TryFromRaw, +}; /// A wrapper around `Box`, to be used in place of event [content] [collection] types in /// Matrix endpoint definition to allow request and response types to contain unknown events in diff --git a/src/lib.rs b/src/lib.rs index 9cfc2b57..42a0241b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -114,12 +114,7 @@ // Since we support Rust 1.36.0, we can't apply this suggestion yet #![allow(clippy::use_self)] -use std::{ - collections::BTreeMap, - error::Error, - fmt::{self, Debug, Display, Formatter}, - time::SystemTime, -}; +use std::{collections::BTreeMap, fmt::Debug, time::SystemTime}; use ruma_identifiers::{EventId, RoomId, UserId}; use serde::Serialize; @@ -135,6 +130,7 @@ mod macros; mod algorithm; mod empty; +mod error; mod event_type; mod from_raw; mod json; @@ -177,81 +173,12 @@ pub mod typing; pub use self::{ algorithm::Algorithm, + error::{FromStrError, InvalidEvent, InvalidInput}, event_type::EventType, from_raw::{FromRaw, TryFromRaw}, json::EventJson, }; -/// An event that is malformed or otherwise invalid. -/// -/// When attempting to deserialize an [`EventJson`](enum.EventJson.html), an error in the input -/// data may cause deserialization to fail, or the JSON structure may be correct, but additional -/// constraints defined in the matrix specification are not upheld. This type provides an error -/// message and a flag for which type of error was encountered. -#[derive(Clone, Debug)] -pub struct InvalidEvent { - message: String, - kind: InvalidEventKind, -} - -#[derive(Copy, Clone, Debug, PartialEq, Eq)] -enum InvalidEventKind { - Deserialization, - Validation, -} - -impl InvalidEvent { - /// A message describing why the event is invalid. - pub fn message(&self) -> String { - self.message.clone() - } - - /// Returns whether this is a deserialization error. - pub fn is_deserialization(&self) -> bool { - self.kind == InvalidEventKind::Deserialization - } - - /// Returns whether this is a validation error. - pub fn is_validation(&self) -> bool { - self.kind == InvalidEventKind::Validation - } -} - -impl Display for InvalidEvent { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.message()) - } -} - -impl Error for InvalidEvent {} - -/// An error returned when attempting to create an event with data that would make it invalid. -/// -/// This type is similar to [`InvalidEvent`](struct.InvalidEvent.html), but used during the -/// construction of a new event, as opposed to deserialization of an existing event from JSON. -#[derive(Clone, Debug, PartialEq)] -pub struct InvalidInput(String); - -impl Display for InvalidInput { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.0) - } -} - -impl Error for InvalidInput {} - -/// An error when attempting to create a value from a string via the `FromStr` trait. -#[derive(Clone, Copy, Eq, Debug, Hash, PartialEq)] -pub struct FromStrError; - -impl Display for FromStrError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "failed to parse type from string") - } -} - -impl Error for FromStrError {} - /// A basic event. pub trait Event: Debug + Serialize + Sized + TryFromRaw { /// The type of this event's `content` field.