pinot_client_rust/
errors.rs

1use std::num::ParseIntError;
2
3use log::error;
4use reqwest::blocking::Response as BlockingReqwestResponse;
5use reqwest::Error as ReqwestError;
6use reqwest::Response as AsyncReqwestResponse;
7use serde_json::error::Error as JsonError;
8use zookeeper::ZkError;
9
10use crate::dynamic_broker_selector::DynamicBrokerSelectorError;
11use crate::request::Request;
12use crate::response::DataType;
13use crate::simple_broker_selector::SimpleBrokerSelectorError;
14
15/// Crate result.
16pub type Result<T> = std::result::Result<T, Error>;
17
18/// Crate error.
19#[derive(Debug, thiserror::Error)]
20#[non_exhaustive]
21pub enum Error {
22    /// Failure to establish an external view watcher.
23    #[error("Failed to set an external view watcher for the path '{0}' due to: {1}")]
24    FailedExternalViewWatcher(String, #[source] ZkError),
25
26    /// Failed Json deserialization.
27    #[error("Failed Json deserialization: {0}")]
28    FailedJsonDeserialization(#[from] JsonError),
29
30    /// Failure to execute a `Request`.
31    #[error("Failed execute request: {0:?}")]
32    FailedRequest(Request, #[source] ReqwestError),
33
34    /// Failure to connect to zookeeper.
35    #[error("Failed connect to zookeeper: {0}")]
36    FailedZookeeperConnection(#[from] ZkError),
37
38    /// Request for incompatible data type.
39    #[error("Requested result data of type {requested:?} as {actual:?}")]
40    IncorrectResultDataType { requested: DataType, actual: DataType },
41
42    /// Invalid broker key.
43    #[error("Invalid broker Key: {0}, should be in the format of Broker_[hostname]_[port]")]
44    InvalidBrokerKey(String),
45
46    /// Invalid broker port.
47    #[error("Invalid broker port: {0}, should be an integer: {1}")]
48    InvalidBrokerPort(String, #[source] ParseIntError),
49
50    /// Invalid result row index.
51    #[error("Invalid result row index: {0}")]
52    InvalidResultRowIndex(usize),
53
54    /// Invalid result column index.
55    #[error("Invalid result column index: {0}")]
56    InvalidResultColumnIndex(usize),
57
58    /// Invalid result column index.
59    #[error("Invalid result column name: {0}")]
60    InvalidResultColumnName(String),
61
62    /// Invalid `Request`.
63    #[error("Failed to build HTTP request from {0:?} due to: {1}")]
64    InvalidRequest(Request, #[source] ReqwestError),
65
66    /// Invalid `BlockingReqwestResponse`.
67    #[error("Encountered invalid HTTP response {0:?}")]
68    InvalidBlockingResponse(BlockingReqwestResponse),
69
70    /// Invalid `AsyncReqwestResponse`.
71    #[error("Encountered invalid HTTP response {0:?}")]
72    InvalidAsyncResponse(AsyncReqwestResponse),
73
74    /// No broker available.
75    #[error("No available broker found")]
76    NoAvailableBroker,
77
78    /// No broker available for given table.
79    #[error("No available broker found for table: {0}")]
80    NoAvailableBrokerForTable(String),
81
82    #[error("Pinot query returned exceptions: {0:?}")]
83    PinotExceptions(Vec<crate::response::PinotException>),
84
85    /// Dynamic broker selector could not be accessed.
86    #[error("Dynamic broker selector unavailable: {0}")]
87    UnavailableDynamicBrokerSelector(#[from] DynamicBrokerSelectorError),
88
89    /// Simple broker selector could not be accessed.
90    #[error("Simple broker selector unavailable: {0}")]
91    UnavailableSimpleBrokerSelector(#[from] SimpleBrokerSelectorError),
92}
93
94pub(crate) fn log_error(
95    msg: &str, func: impl Fn() -> Result<()>,
96) {
97    let msg = msg.to_string();
98    if let Err(e) = func() {
99        error!("'{}': {:?}", msg, e);
100    }
101}