flare_dht/
error.rs

1use std::error::Error;
2
3use tonic::Status;
4
5use crate::{shard::ShardId, NodeId};
6
7#[derive(thiserror::Error, Debug)]
8pub enum FlareInternalError {
9    #[error("Uri parsing error: {0}")]
10    InvalidUrl(#[from] http::uri::InvalidUri),
11    #[error("No node with id: {0}")]
12    NoSuchNode(NodeId),
13    #[error("No leader")]
14    NoLeader,
15    #[error("{0}")]
16    ConnectionError(#[from] tonic::transport::Error),
17    #[error("RaftError: {0}")]
18    RaftError(#[from] Box<dyn Error + Send + Sync + 'static>),
19}
20
21#[derive(thiserror::Error, Debug)]
22pub enum FlareError {
23    #[error("No shard `{0}` on current node")]
24    NoShardFound(ShardId),
25    #[error("No shard `{0:?}` on current node")]
26    NoShardsFound(Vec<ShardId>),
27    #[error("No collection `{0}` in cluster")]
28    NoCollection(String),
29    #[error("Invalid: {0}")]
30    InvalidArgument(String),
31    #[error("UnknownError: {0}")]
32    UnknownError(#[from] Box<dyn Error + Send + Sync + 'static>),
33    #[error("RPC Error: {0}")]
34    RpcError(#[from] Status),
35    #[error("{0}")]
36    InternalError(#[from] FlareInternalError),
37    #[error("{0}")]
38    ConnectionPoolError(#[from] mobc::Error<FlareInternalError>),
39    #[error("Infallible")]
40    Infallible,
41}
42
43impl FlareError {
44    pub fn from<E>(error: E) -> FlareError
45    where
46        E: Error + Send + Sync + 'static,
47    {
48        FlareError::UnknownError(Box::new(error))
49    }
50}
51
52impl From<FlareError> for tonic::Status {
53    fn from(value: FlareError) -> Self {
54        match value {
55            FlareError::InvalidArgument(msg) => Status::invalid_argument(msg),
56            FlareError::UnknownError(e) => Status::from_error(e),
57            FlareError::InternalError(e) => Status::internal(e.to_string()),
58            FlareError::RpcError(e) => e,
59            _ => Status::not_found(value.to_string()),
60        }
61    }
62}
63
64impl From<FlareInternalError> for tonic::Status {
65    fn from(value: FlareInternalError) -> Self {
66        Status::internal(value.to_string())
67    }
68}