flare_dht/
error.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
use std::error::Error;

use tonic::Status;

use crate::{shard::ShardId, NodeId};

#[derive(thiserror::Error, Debug)]
pub enum FlareInternalError {
    #[error("Uri parsing error: {0}")]
    InvalidUrl(#[from] http::uri::InvalidUri),
    #[error("No node with id: {0}")]
    NoSuchNode(NodeId),
    #[error("No leader")]
    NoLeader,
    #[error("{0}")]
    ConnectionError(#[from] tonic::transport::Error),
    #[error("RaftError: {0}")]
    RaftError(#[from] Box<dyn Error + Send + Sync + 'static>),
}

#[derive(thiserror::Error, Debug)]
pub enum FlareError {
    #[error("No shard `{0}` on current node")]
    NoShardFound(ShardId),
    #[error("No collection `{0}` in cluster")]
    NoCollection(String),
    #[error("Invalid: {0}")]
    InvalidArgument(String),
    #[error("UnknownError: {0}")]
    UnknownError(#[from] Box<dyn Error + Send + Sync + 'static>),
    #[error("RPC Error: {0}")]
    RpcError(#[from] Status),
    #[error("{0}")]
    InternalError(#[from] FlareInternalError),
    #[error("{0}")]
    ConnectionPoolError(#[from] mobc::Error<FlareInternalError>),
    #[error("Infallible")]
    Infallible,
}

impl FlareError {
    pub fn from<E>(error: E) -> FlareError
    where
        E: Error + Send + Sync + 'static,
    {
        FlareError::UnknownError(Box::new(error))
    }
}

impl From<FlareError> for tonic::Status {
    fn from(value: FlareError) -> Self {
        match value {
            FlareError::InvalidArgument(msg) => Status::invalid_argument(msg),
            FlareError::UnknownError(e) => Status::from_error(e),
            FlareError::InternalError(e) => Status::internal(e.to_string()),
            FlareError::RpcError(e) => e,
            _ => Status::not_found(value.to_string()),
        }
    }
}

impl From<FlareInternalError> for tonic::Status {
    fn from(value: FlareInternalError) -> Self {
        Status::internal(value.to_string())
    }
}