summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock1
-rw-r--r--zellij-utils/Cargo.toml1
-rw-r--r--zellij-utils/src/input/config.rs82
-rw-r--r--zellij-utils/src/input/plugins.rs29
4 files changed, 21 insertions, 92 deletions
diff --git a/Cargo.lock b/Cargo.lock
index e19fea297..972914db3 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2926,6 +2926,7 @@ dependencies = [
"strum",
"tempfile",
"termion",
+ "thiserror",
"unicode-width",
"url",
"vte",
diff --git a/zellij-utils/Cargo.toml b/zellij-utils/Cargo.toml
index f1d9dc082..480374e66 100644
--- a/zellij-utils/Cargo.toml
+++ b/zellij-utils/Cargo.toml
@@ -28,6 +28,7 @@ strip-ansi-escapes = "0.1.0"
structopt = "0.3"
strum = "0.20.0"
termion = "1.5.0"
+thiserror = "1.0.30"
url = { version = "2.2.2", features = ["serde"] }
vte = "0.10.1"
zellij-tile = { path = "../zellij-tile/", version = "0.20.0" }
diff --git a/zellij-utils/src/input/config.rs b/zellij-utils/src/input/config.rs
index 66104016c..752e63e35 100644
--- a/zellij-utils/src/input/config.rs
+++ b/zellij-utils/src/input/config.rs
@@ -1,9 +1,9 @@
//! Deserializes configuration options.
-use std::error;
-use std::fmt::{self, Display};
+use std::fmt;
use std::fs::File;
use std::io::{self, Read};
use std::path::{Path, PathBuf};
+use thiserror::Error;
use serde::Deserialize;
use std::convert::{TryFrom, TryInto};
@@ -39,20 +39,26 @@ pub struct Config {
pub plugins: PluginsConfig,
}
-#[derive(Debug)]
+#[derive(Error, Debug)]
pub enum ConfigError {
// Deserialization error
- Serde(serde_yaml::Error),
+ #[error("Deserialization error: {0}")]
+ Serde(#[from] serde_yaml::Error),
// Io error
- Io(io::Error),
+ #[error("IoError: {0}")]
+ Io(#[from] io::Error),
// Io error with path context
+ #[error("IoError: {0}, File: {1}")]
IoPath(io::Error, PathBuf),
// Internal Deserialization Error
- FromUtf8(std::string::FromUtf8Error),
+ #[error("FromUtf8Error: {0}")]
+ FromUtf8(#[from] std::string::FromUtf8Error),
// Naming a part in a tab is unsupported
- LayoutNameInTab(LayoutNameInTabError),
+ #[error("There was an error in the layout file, {0}")]
+ LayoutNameInTab(#[from] LayoutNameInTabError),
// Plugins have a semantic error, usually trying to parse two of the same tag
- PluginsError(PluginsConfigError),
+ #[error("PluginsError: {0}")]
+ PluginsError(#[from] PluginsConfigError),
}
impl Default for Config {
@@ -195,66 +201,6 @@ impl std::error::Error for LayoutNameInTabError {
}
}
-impl Display for ConfigError {
- fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
- match self {
- ConfigError::Io(ref err) => write!(formatter, "IoError: {}", err),
- ConfigError::IoPath(ref err, ref path) => {
- write!(formatter, "IoError: {}, File: {}", err, path.display(),)
- }
- ConfigError::Serde(ref err) => write!(formatter, "Deserialization error: {}", err),
- ConfigError::FromUtf8(ref err) => write!(formatter, "FromUtf8Error: {}", err),
- ConfigError::LayoutNameInTab(ref err) => {
- write!(formatter, "There was an error in the layout file, {}", err)
- }
- ConfigError::PluginsError(ref err) => write!(formatter, "PluginsError: {}", err),
- }
- }
-}
-
-impl std::error::Error for ConfigError {
- fn cause(&self) -> Option<&dyn error::Error> {
- match *self {
- ConfigError::Io(ref err) => Some(err),
- ConfigError::IoPath(ref err, _) => Some(err),
- ConfigError::Serde(ref err) => Some(err),
- ConfigError::FromUtf8(ref err) => Some(err),
- ConfigError::LayoutNameInTab(ref err) => Some(err),
- ConfigError::PluginsError(ref err) => Some(err),
- }
- }
-}
-
-impl From<io::Error> for ConfigError {
- fn from(err: io::Error) -> ConfigError {
- ConfigError::Io(err)
- }
-}
-
-impl From<serde_yaml::Error> for ConfigError {
- fn from(err: serde_yaml::Error) -> ConfigError {
- ConfigError::Serde(err)
- }
-}
-
-impl From<std::string::FromUtf8Error> for ConfigError {
- fn from(err: std::string::FromUtf8Error) -> ConfigError {
- ConfigError::FromUtf8(err)
- }
-}
-
-impl From<LayoutNameInTabError> for ConfigError {
- fn from(err: LayoutNameInTabError) -> ConfigError {
- ConfigError::LayoutNameInTab(err)
- }
-}
-
-impl From<PluginsConfigError> for ConfigError {
- fn from(err: PluginsConfigError) -> ConfigError {
- ConfigError::PluginsError(err)
- }
-}
-
// The unit test location.
#[cfg(test)]
mod config_test {
diff --git a/zellij-utils/src/input/plugins.rs b/zellij-utils/src/input/plugins.rs
index 931d9f780..e97a8ad03 100644
--- a/zellij-utils/src/input/plugins.rs
+++ b/zellij-utils/src/input/plugins.rs
@@ -2,9 +2,9 @@
use std::borrow::Borrow;
use std::collections::HashMap;
use std::convert::TryFrom;
-use std::fmt::{self, Display};
use std::fs;
use std::path::{Path, PathBuf};
+use thiserror::Error;
use lazy_static::lazy_static;
use serde::{Deserialize, Serialize};
@@ -189,35 +189,16 @@ impl Default for PluginTypeFromYaml {
}
}
-#[derive(Debug, PartialEq)]
+#[derive(Error, Debug, PartialEq)]
pub enum PluginsConfigError {
+ #[error("Duplication in plugin tag names is not allowed: '{}'", String::from(.0.clone()))]
DuplicatePlugins(PluginTag),
+ #[error("Only 'file:' and 'zellij:' url schemes are supported for plugin lookup. '{0}' does not match either.")]
InvalidUrl(Url),
+ #[error("Could not find plugin at the path: '{0:?}'")]
InvalidPluginLocation(PathBuf),
}
-impl std::error::Error for PluginsConfigError {}
-impl Display for PluginsConfigError {
- fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
- match self {
- PluginsConfigError::DuplicatePlugins(tag) => write!(
- formatter,
- "Duplication in plugin tag names is not allowed: '{}'",
- String::from(tag.clone())
- ),
- PluginsConfigError::InvalidUrl(url) => write!(
- formatter,
- "Only 'file:' and 'zellij:' url schemes are supported for plugin lookup. '{}' does not match either.",
- url
- ),
- PluginsConfigError::InvalidPluginLocation(path) => write!(
- formatter,
- "Could not find plugin at the path: '{:?}'", path
- ),
- }
- }
-}
-
#[cfg(test)]
mod tests {
use super::*;