scouter_client/
error.rs

1use pyo3::exceptions::PyRuntimeError;
2use pyo3::PyErr;
3use scouter_drift::error::DriftError;
4use scouter_profile::DataProfileError;
5use thiserror::Error;
6
7#[derive(Error, Debug)]
8pub enum DataError {
9    #[error(transparent)]
10    PyErr(#[from] pyo3::PyErr),
11
12    #[error("Failed to downcast Python object: {0}")]
13    DowncastError(String),
14
15    #[error("Data type not supported: {0}")]
16    UnsupportedDataTypeError(String),
17
18    #[error("Data type must be a numpy array")]
19    NotNumpyArrayError,
20
21    #[error("Column names must be strings")]
22    ColumnNamesMustBeStrings,
23
24    #[error("Detected missing, Nan, or infinite values in the data. Scouter does not currently support these value types")]
25    MissingNanOrInfiniteValues,
26}
27impl<'a> From<pyo3::DowncastError<'a, 'a>> for DataError {
28    fn from(err: pyo3::DowncastError) -> Self {
29        DataError::DowncastError(err.to_string())
30    }
31}
32
33impl From<DataError> for PyErr {
34    fn from(err: DataError) -> PyErr {
35        let msg = err.to_string();
36        PyRuntimeError::new_err(msg)
37    }
38}
39
40impl From<DataError> for DriftError {
41    fn from(err: DataError) -> Self {
42        DriftError::RunTimeError(err.to_string())
43    }
44}
45
46impl From<DataError> for DataProfileError {
47    fn from(err: DataError) -> Self {
48        DataProfileError::RuntimeError(err.to_string())
49    }
50}
51
52#[derive(Error, Debug)]
53pub enum ClientError {
54    #[error(transparent)]
55    HeaderError(#[from] reqwest::header::InvalidHeaderValue),
56
57    #[error(transparent)]
58    ReqwestError(#[from] reqwest::Error),
59
60    #[error("Unauthorized")]
61    Unauthorized,
62
63    #[error("Failed to update auth token")]
64    UpdateAuthTokenError,
65
66    #[error("Failed to insert profile")]
67    InsertProfileError,
68
69    #[error("Failed to update profile")]
70    UpdateProfileError,
71
72    #[error("Failed to get drift alerts")]
73    GetDriftAlertError,
74
75    #[error("Failed to get drift profile")]
76    GetDriftProfileError,
77
78    #[error(transparent)]
79    SerdeQsError(#[from] serde_qs::Error),
80
81    #[error(transparent)]
82    SerdeJsonError(#[from] serde_json::Error),
83
84    #[error("Invalid config type. Expected HTTPConfig")]
85    InvalidConfigTypeError,
86
87    #[error("Failed to get drift data")]
88    GetDriftDataError,
89
90    #[error("{0}")]
91    PyError(String),
92
93    #[error(transparent)]
94    UtilError(#[from] scouter_types::error::UtilError),
95
96    #[error("Failed to parse JWT token from response: {0}")]
97    ParseJwtTokenError(String),
98}
99
100impl From<ClientError> for PyErr {
101    fn from(err: ClientError) -> PyErr {
102        let msg = err.to_string();
103        PyRuntimeError::new_err(msg)
104    }
105}
106
107impl From<PyErr> for ClientError {
108    fn from(err: PyErr) -> ClientError {
109        ClientError::PyError(err.to_string())
110    }
111}