1use serde::Deserialize;
26use std::fmt::Debug;
27
28#[derive(Debug, Deserialize)]
29pub enum Error {
30 ClientBuilderError(ClientBuilderError),
31 ClientError(ClientError),
32 BackendError(BackendError),
33}
34
35#[derive(Debug, Deserialize)]
36pub enum ClientBuilderError {
37 MissingEnvironmentVariable(String),
38 CannotInstantiateClient(String),
39}
40
41#[derive(Debug, Deserialize)]
42pub enum ClientError {
43 CannotLogIn(String),
44 HttpStatus(u16),
45 RequestError(String),
46 SerializationError(String),
47 GenericError(String),
48}
49
50#[derive(Debug, Deserialize)]
51pub struct BackendError {
52 pub code: Option<String>,
53 pub error_code: Option<String>,
54 #[serde(rename = "errorId")]
55 pub error_id: Option<String>,
56 pub errors: Option<Vec<ErrorItem>>,
57 pub id: Option<String>,
58 pub message: Option<String>,
59 pub timestamp: Option<u64>,
60}
61
62#[derive(Debug, Deserialize)]
63pub struct ErrorItem {
64 pub error_code: String,
65 pub message: String,
66}
67
68pub type ApiResult<T> = std::result::Result<T, Error>;
69
70impl From<ClientBuilderError> for Error {
71 fn from(error: ClientBuilderError) -> Self {
72 Error::ClientBuilderError(error)
73 }
74}
75
76impl From<serde_json::Error> for Error {
77 fn from(error: serde_json::Error) -> Self {
78 Error::ClientError(ClientError::SerializationError(format!("{error:?}")))
79 }
80}
81
82impl From<reqwest::Error> for Error {
83 fn from(error: reqwest::Error) -> Self {
84 Error::ClientError(ClientError::RequestError(format!("{error:?}")))
85 }
86}