aboutsummaryrefslogtreecommitdiff
path: root/src/util/error.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/error.rs')
-rw-r--r--src/util/error.rs42
1 files changed, 40 insertions, 2 deletions
diff --git a/src/util/error.rs b/src/util/error.rs
index 390327f1..c8d3c680 100644
--- a/src/util/error.rs
+++ b/src/util/error.rs
@@ -47,8 +47,13 @@ pub enum Error {
#[error(display = "Timeout")]
Timeout,
- #[error(display = "Too many errors: {:?}", _0)]
- TooManyErrors(Vec<String>),
+ #[error(
+ display = "Could not reach quorum. {} of {} request succeeded, others returned errors: {:?}",
+ _0,
+ _1,
+ _2
+ )]
+ Quorum(usize, usize, Vec<String>),
#[error(display = "Bad RPC: {}", _0)]
BadRpc(String),
@@ -81,6 +86,39 @@ impl<T> From<tokio::sync::mpsc::error::SendError<T>> for Error {
}
}
+impl<'a> From<&'a str> for Error {
+ fn from(v: &'a str) -> Error {
+ Error::Message(v.to_string())
+ }
+}
+
+impl From<String> for Error {
+ fn from(v: String) -> Error {
+ Error::Message(v)
+ }
+}
+
+pub trait ErrorContext<T, E> {
+ fn err_context<C: std::borrow::Borrow<str>>(self, ctx: C) -> Result<T, Error>;
+}
+
+impl<T, E> ErrorContext<T, E> for Result<T, E>
+where
+ E: std::fmt::Display,
+{
+ #[inline]
+ fn err_context<C: std::borrow::Borrow<str>>(self, ctx: C) -> Result<T, Error> {
+ match self {
+ Ok(x) => Ok(x),
+ Err(e) => Err(Error::Message(format!(
+ "{}\nOriginal error: {}",
+ ctx.borrow(),
+ e
+ ))),
+ }
+ }
+}
+
// Custom serialization for our error type, for use in RPC.
// Errors are serialized as a string of their Display representation.
// Upon deserialization, they all become a RemoteError with the