1use pyo3::exceptions::PyRuntimeError;
2use pyo3::pyclass::PyClassGuardError;
3use pyo3::PyErr;
4use thiserror::Error;
5#[derive(Error, Debug)]
6pub enum ClientError {
7 #[error(transparent)]
8 HeaderError(#[from] reqwest::header::InvalidHeaderValue),
9
10 #[error(transparent)]
11 ReqwestError(#[from] reqwest::Error),
12
13 #[error("Unauthorized")]
14 Unauthorized,
15
16 #[error("Failed to update auth token")]
17 UpdateAuthTokenError,
18
19 #[error("Failed to insert profile")]
20 InsertProfileError,
21
22 #[error("Failed to update profile")]
23 UpdateProfileError,
24
25 #[error("Failed to get drift alerts")]
26 GetDriftAlertError,
27
28 #[error("Failed to get drift profile")]
29 GetDriftProfileError,
30
31 #[error(transparent)]
32 SerdeQsError(#[from] serde_qs::Error),
33
34 #[error(transparent)]
35 SerdeJsonError(#[from] serde_json::Error),
36
37 #[error("Invalid config type. Expected HttpConfig")]
38 InvalidConfigTypeError,
39
40 #[error("Failed to get drift data")]
41 GetDriftDataError,
42
43 #[error("{0}")]
44 PyError(String),
45
46 #[error(transparent)]
47 UtilError(#[from] scouter_types::error::UtilError),
48
49 #[error("Failed to parse JWT token from response: {0}")]
50 ParseJwtTokenError(String),
51
52 #[error("Failed to get paginated traces")]
53 GetPaginatedTracesError,
54
55 #[error("Failed to refresh trace summary")]
56 RefreshTraceSummaryError,
57
58 #[error("Failed to get trace spans")]
59 GetTraceSpansError,
60
61 #[error("Failed to get trace metrics")]
62 GetTraceMetricsError,
63
64 #[error("Failed to get trace baggage")]
65 GetTraceBaggageError,
66
67 #[error("Failed to get tags")]
68 GetTagsError,
69
70 #[error("Invalid drift type for GenAI task request")]
71 InvalidDriftTypeForGenAITask,
72
73 #[error("Invalid drift type for GenAI workflow request")]
74 GetTraceSpansFromFiltersError,
75}
76
77impl From<ClientError> for PyErr {
78 fn from(err: ClientError) -> PyErr {
79 let msg = err.to_string();
80 PyRuntimeError::new_err(msg)
81 }
82}
83
84impl From<PyErr> for ClientError {
85 fn from(err: PyErr) -> ClientError {
86 ClientError::PyError(err.to_string())
87 }
88}
89
90impl<'a, 'py> From<PyClassGuardError<'a, 'py>> for ClientError {
91 fn from(err: PyClassGuardError<'a, 'py>) -> Self {
92 ClientError::PyError(err.to_string())
93 }
94}