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}