2018-03-30 10:43:38 -07:00
|
|
|
//! The `result` module exposes a Result type that propagates one of many different Error types.
|
2018-03-29 11:20:54 -07:00
|
|
|
|
2021-12-03 09:00:31 -08:00
|
|
|
use {
|
2023-01-31 02:44:58 -08:00
|
|
|
crate::serve_repair::RepairVerifyError,
|
2023-04-21 08:39:16 -07:00
|
|
|
solana_gossip::{cluster_info, contact_info, gossip_error::GossipError},
|
2021-12-03 09:00:31 -08:00
|
|
|
solana_ledger::blockstore,
|
2022-08-17 15:01:51 -07:00
|
|
|
thiserror::Error,
|
2021-12-03 09:00:31 -08:00
|
|
|
};
|
2018-03-07 13:47:13 -08:00
|
|
|
|
2022-08-17 15:01:51 -07:00
|
|
|
#[derive(Debug, Error)]
|
2018-03-07 13:47:13 -08:00
|
|
|
pub enum Error {
|
2022-08-17 15:01:51 -07:00
|
|
|
#[error(transparent)]
|
|
|
|
Blockstore(#[from] blockstore::BlockstoreError),
|
|
|
|
#[error(transparent)]
|
|
|
|
ClusterInfo(#[from] cluster_info::ClusterInfoError),
|
|
|
|
#[error(transparent)]
|
|
|
|
Gossip(#[from] GossipError),
|
|
|
|
#[error(transparent)]
|
2023-04-21 08:39:16 -07:00
|
|
|
InvalidContactInfo(#[from] contact_info::Error),
|
|
|
|
#[error(transparent)]
|
2022-08-17 15:01:51 -07:00
|
|
|
Io(#[from] std::io::Error),
|
|
|
|
#[error("ReadyTimeout")]
|
2021-06-18 11:47:40 -07:00
|
|
|
ReadyTimeout,
|
2022-08-17 15:01:51 -07:00
|
|
|
#[error(transparent)]
|
|
|
|
Recv(#[from] crossbeam_channel::RecvError),
|
|
|
|
#[error(transparent)]
|
|
|
|
RecvTimeout(#[from] crossbeam_channel::RecvTimeoutError),
|
|
|
|
#[error("Send")]
|
2021-06-18 11:47:40 -07:00
|
|
|
Send,
|
2022-08-17 15:01:51 -07:00
|
|
|
#[error("TrySend")]
|
|
|
|
TrySend,
|
|
|
|
#[error(transparent)]
|
|
|
|
Serialize(#[from] std::boxed::Box<bincode::ErrorKind>),
|
|
|
|
#[error(transparent)]
|
|
|
|
WeightedIndex(#[from] rand::distributions::weighted::WeightedError),
|
2023-01-31 02:44:58 -08:00
|
|
|
#[error(transparent)]
|
|
|
|
RepairVerify(#[from] RepairVerifyError),
|
2018-03-07 13:47:13 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
pub type Result<T> = std::result::Result<T, Error>;
|
|
|
|
|
2020-07-20 17:29:07 -07:00
|
|
|
impl std::convert::From<crossbeam_channel::ReadyTimeoutError> for Error {
|
|
|
|
fn from(_e: crossbeam_channel::ReadyTimeoutError) -> Error {
|
2021-06-18 11:47:40 -07:00
|
|
|
Error::ReadyTimeout
|
2020-07-20 17:29:07 -07:00
|
|
|
}
|
|
|
|
}
|
2020-09-01 22:06:06 -07:00
|
|
|
impl<T> std::convert::From<crossbeam_channel::TrySendError<T>> for Error {
|
|
|
|
fn from(_e: crossbeam_channel::TrySendError<T>) -> Error {
|
2022-01-11 02:44:46 -08:00
|
|
|
Error::TrySend
|
2020-09-01 22:06:06 -07:00
|
|
|
}
|
|
|
|
}
|
2022-01-11 02:44:46 -08:00
|
|
|
impl<T> std::convert::From<crossbeam_channel::SendError<T>> for Error {
|
|
|
|
fn from(_e: crossbeam_channel::SendError<T>) -> Error {
|
2021-06-18 11:47:40 -07:00
|
|
|
Error::Send
|
2018-03-07 13:47:13 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
2021-12-03 09:00:31 -08:00
|
|
|
use {
|
|
|
|
crate::result::{Error, Result},
|
2022-01-11 02:44:46 -08:00
|
|
|
crossbeam_channel::{unbounded, RecvError, RecvTimeoutError},
|
|
|
|
std::{io, io::Write, panic},
|
2021-12-03 09:00:31 -08:00
|
|
|
};
|
2018-03-07 13:47:13 -08:00
|
|
|
|
|
|
|
fn send_error() -> Result<()> {
|
2022-01-11 02:44:46 -08:00
|
|
|
let (s, r) = unbounded();
|
2018-03-07 13:47:13 -08:00
|
|
|
drop(r);
|
|
|
|
s.send(())?;
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn from_test() {
|
2021-06-18 11:47:40 -07:00
|
|
|
assert_matches!(Error::from(RecvError {}), Error::Recv(_));
|
2018-03-07 13:47:13 -08:00
|
|
|
assert_matches!(
|
|
|
|
Error::from(RecvTimeoutError::Timeout),
|
2021-06-18 11:47:40 -07:00
|
|
|
Error::RecvTimeout(_)
|
2018-03-07 13:47:13 -08:00
|
|
|
);
|
2021-06-18 11:47:40 -07:00
|
|
|
assert_matches!(send_error(), Err(Error::Send));
|
2018-03-07 13:47:13 -08:00
|
|
|
let ioe = io::Error::new(io::ErrorKind::NotFound, "hi");
|
2021-02-18 23:42:09 -08:00
|
|
|
assert_matches!(Error::from(ioe), Error::Io(_));
|
2018-03-07 13:47:13 -08:00
|
|
|
}
|
|
|
|
#[test]
|
|
|
|
fn fmt_test() {
|
|
|
|
write!(io::sink(), "{:?}", Error::from(RecvError {})).unwrap();
|
|
|
|
write!(io::sink(), "{:?}", Error::from(RecvTimeoutError::Timeout)).unwrap();
|
|
|
|
write!(io::sink(), "{:?}", send_error()).unwrap();
|
|
|
|
write!(
|
|
|
|
io::sink(),
|
|
|
|
"{:?}",
|
|
|
|
Error::from(io::Error::new(io::ErrorKind::NotFound, "hi"))
|
2018-12-07 19:01:28 -08:00
|
|
|
)
|
|
|
|
.unwrap();
|
2018-03-07 13:47:13 -08:00
|
|
|
}
|
|
|
|
}
|