scouter_evaluate/
error.rs

1use pyo3::exceptions::PyRuntimeError;
2use pyo3::PyErr;
3use thiserror::Error;
4use tracing::error;
5
6#[derive(Error, Debug)]
7pub enum EvaluationError {
8    #[error("Invalid response type. Expected Score")]
9    InvalidResponseError,
10
11    #[error(transparent)]
12    WorkflowError(#[from] potato_head::WorkflowError),
13
14    #[error(transparent)]
15    PyErr(#[from] pyo3::PyErr),
16
17    #[error("{0}")]
18    DowncastError(String),
19
20    #[error(transparent)]
21    JoinError(#[from] tokio::task::JoinError),
22
23    #[error("Missing key: {0}")]
24    MissingKeyError(String),
25
26    #[error("Invalid context type. Context must be a PyDict or a Pydantic BaseModel")]
27    MustBeDictOrBaseModel,
28
29    #[error(transparent)]
30    IoError(#[from] std::io::Error),
31
32    #[error(transparent)]
33    TypeError(#[from] scouter_types::error::TypeError),
34
35    #[error("Invalid embedder type. Expected an instance of Embedder")]
36    InvalidEmbedderType,
37
38    #[error("No results found in evaluation results")]
39    NoResultsFound,
40
41    #[error(transparent)]
42    ShapeError(#[from] ndarray::ShapeError),
43
44    #[error(transparent)]
45    DataProfileError(#[from] scouter_profile::error::DataProfileError),
46
47    #[error(transparent)]
48    SerdeError(#[from] serde_json::Error),
49}
50
51impl From<EvaluationError> for PyErr {
52    fn from(err: EvaluationError) -> PyErr {
53        let msg = err.to_string();
54        error!("{}", msg);
55        PyRuntimeError::new_err(msg)
56    }
57}
58
59impl<'a> From<pyo3::DowncastError<'a, 'a>> for EvaluationError {
60    fn from(err: pyo3::DowncastError) -> Self {
61        EvaluationError::DowncastError(err.to_string())
62    }
63}