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}