aboutsummaryrefslogtreecommitdiffstats
path: root/src/error.rs
diff options
context:
space:
mode:
authorJokler <jokler.contact@gmail.com>2018-03-02 22:11:21 +0100
committerJokler <jokler.contact@gmail.com>2018-03-02 22:11:21 +0100
commit0b4131e8cf91ed10f24d3faed341034d518aea53 (patch)
tree09498ec2f2ec495a1b45a6762e61ed67f496c6f8 /src/error.rs
parent0bcc7c0923852b48ebbb94ceeecc98f551fa920d (diff)
downloadfrippy-0b4131e8cf91ed10f24d3faed341034d518aea53.tar.gz
frippy-0b4131e8cf91ed10f24d3faed341034d518aea53.zip
Use Error & ErrorKind pair instead of simple enums
Each plugin should define its own errors with a respective variant in the main ErrorKind of frippy. A new procedural macro was added to reduce the boilerplate required for new error system. It can be used by deriving "Error" and adding a name for the Error via the "error" attribute. So far non of the plugins except for Url and Factoids use their own errors yet.
Diffstat (limited to 'src/error.rs')
-rw-r--r--src/error.rs114
1 files changed, 22 insertions, 92 deletions
diff --git a/src/error.rs b/src/error.rs
index fa232be..36d5724 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -1,101 +1,31 @@
//! Errors for `frippy` crate using `failure`.
-use std::io::Error as IoError;
-use irc::error::IrcError;
-use reqwest::Error as ReqwestError;
-#[cfg(feature = "mysql")]
-use r2d2::Error as R2d2Error;
+use failure::Fail;
-/// The main crate-wide error type.
-#[derive(Debug, Fail)]
-pub enum FrippyError {
- /// A plugin error
- #[fail(display = "A plugin error occured")]
- Plugin(#[cause] PluginError),
-
- /// An IRC error
- #[fail(display = "An IRC error occured")]
- Irc(#[cause] IrcError),
-
- /// Missing config error
- #[fail(display = "No config file was found")]
- MissingConfig,
-
- /// A reqwest error
- #[fail(display = "A reqwest error occured")]
- Reqwest(#[cause] ReqwestError),
-
- /// An I/O error
- #[fail(display = "An I/O error occured")]
- Io(#[cause] IoError),
-
- /// An r2d2 error
- #[cfg(feature = "mysql")]
- #[fail(display = "An r2d2 error occured")]
- R2d2(#[cause] R2d2Error),
-
- /// Reached download limit error
- #[fail(display = "Reached download limit of {} KiB", limit)]
- DownloadLimit { limit: usize },
+pub fn log_error(e: FrippyError) {
+ let text = e.causes()
+ .skip(1)
+ .fold(format!("{}", e), |acc, err| format!("{}: {}", acc, err));
+ error!("{}", text);
}
-/// Errors related to plugins
-#[derive(Debug, Fail)]
-pub enum PluginError {
- /// A Url error
- #[fail(display = "A Url error occured")]
- Url(#[cause] UrlError),
-
- /// A Factoids error
- #[fail(display = "{}", error)]
- Factoids { error: String },
-}
-
-/// A URL plugin error
-#[derive(Debug, Fail)]
-pub enum UrlError {
- /// Missing URL error
- #[fail(display = "No URL was found")]
- MissingUrl,
-
- /// Missing title error
- #[fail(display = "No title was found")]
- MissingTitle,
-}
-
-impl From<UrlError> for FrippyError {
- fn from(e: UrlError) -> FrippyError {
- FrippyError::Plugin(PluginError::Url(e))
- }
-}
-
-impl From<PluginError> for FrippyError {
- fn from(e: PluginError) -> FrippyError {
- FrippyError::Plugin(e)
- }
-}
-
-impl From<IrcError> for FrippyError {
- fn from(e: IrcError) -> FrippyError {
- FrippyError::Irc(e)
- }
-}
+/// The main crate-wide error type.
+#[derive(Copy, Clone, Eq, PartialEq, Debug, Fail, Error)]
+#[error = "FrippyError"]
+pub enum ErrorKind {
+ /// Connection error
+ #[fail(display = "A connection error occured")]
+ Connection,
-impl From<ReqwestError> for FrippyError {
- fn from(e: ReqwestError) -> FrippyError {
- FrippyError::Reqwest(e)
- }
-}
+ /// A Url error
+ #[fail(display = "A Url error has occured")]
+ Url,
-impl From<IoError> for FrippyError {
- fn from(e: IoError) -> FrippyError {
- FrippyError::Io(e)
- }
-}
+ /// A Tell error
+ #[fail(display = "A Tell error has occured")]
+ Tell,
-#[cfg(feature = "mysql")]
-impl From<R2d2Error> for FrippyError {
- fn from(e: R2d2Error) -> FrippyError {
- FrippyError::R2d2(e)
- }
+ /// A Factoids error
+ #[fail(display = "A Factoids error has occured")]
+ Factoids,
}