diff options
author | Daniel Schadt <kingdread@gmx.de> | 2021-10-07 23:19:31 +0200 |
---|---|---|
committer | Daniel Schadt <kingdread@gmx.de> | 2021-10-07 23:19:31 +0200 |
commit | 8510ed3e43ff0a92565815b02645cc7bf5cb6b18 (patch) | |
tree | 7dc820e537583705099cf1f77b8a49e100b9a64d /src/useropts.rs | |
parent | cd110bcc5db993ae329d85674590f9a453014f8c (diff) | |
download | kondou-8510ed3e43ff0a92565815b02645cc7bf5cb6b18.tar.gz kondou-8510ed3e43ff0a92565815b02645cc7bf5cb6b18.tar.bz2 kondou-8510ed3e43ff0a92565815b02645cc7bf5cb6b18.zip |
Modernize error handling
This sprinkles in some thiserror and anyhow instead of the hand-rolled
'error_froms!' macros and the MainResult. The benefit of this is that
we're hooking into an established ecosystem of error handling and we're
saving a lot of effort in the hand-written Display and Error
implementations.
The reason for not sprinkling anyhow everywhere is because the
retrieval/rendering part of kondou could be split off into a library at
some point, in which case we want to have a proper KondouError type.
However, the argument could be made that the current split of errors is
not very good, especially because many of them boil down to the same
inner errors (RenderError wrapping ApiError wrapping reqwest::Error),
which keeps unnecessary information.
Some future improvements may include
1.) Unifying those error enums into one bigger enum
2.) Attaching more context through anyhow in the application layer
3.) Properly define an API and split off the inner logic from the UI
logic
Diffstat (limited to 'src/useropts.rs')
-rw-r--r-- | src/useropts.rs | 39 |
1 files changed, 8 insertions, 31 deletions
diff --git a/src/useropts.rs b/src/useropts.rs index 27e14df..2e38f05 100644 --- a/src/useropts.rs +++ b/src/useropts.rs @@ -11,45 +11,22 @@ use image::Rgba; use rusttype::Font; use serde::{Deserialize, Serialize}; -use std::{error::Error, fmt, fs, io, path::Path}; +use std::{fs, io, path::Path}; +use thiserror::Error; use super::render::{Alignment, RenderOptions}; /// Error that can occur during loading or converting user options. -#[derive(Debug)] +#[derive(Error, Debug)] pub enum ConfigError { - Io(io::Error), - Serialization(toml::de::Error), + #[error("I/O error")] + Io(#[from] io::Error), + #[error("Deserialization error")] + Serialization(#[from] toml::de::Error), + #[error("Font loading error")] Font, } -error_froms! { - ConfigError, - err: io::Error => ConfigError::Io(err), - err: toml::de::Error => ConfigError::Serialization(err), -} - -impl fmt::Display for ConfigError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "ConfigError: ")?; - match *self { - ConfigError::Io(_) => write!(f, "input/output error"), - ConfigError::Serialization(_) => write!(f, "serialization error"), - ConfigError::Font => write!(f, "could not load the font"), - } - } -} - -impl Error for ConfigError { - fn source(&self) -> Option<&(dyn Error + 'static)> { - match *self { - ConfigError::Io(ref err) => Some(err), - ConfigError::Serialization(ref err) => Some(err), - ConfigError::Font => None, - } - } -} - macro_rules! maybe_take_from { (from: $from:expr, to: $to:ident, $($field:ident,)*) => { $( |