alchemy_api/cores/
error.rs

1use serde::{Deserialize, Serialize};
2
3/// Alchemy error in response.
4#[derive(Debug, Clone, Serialize, Deserialize)]
5#[serde(untagged)]
6pub enum AlchemyError {
7    /// Nested error.
8    Nested(NestedError),
9    /// Flatten error.
10    Flatten(FlattenError),
11}
12
13/// Alchemy error in response.
14#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct FlattenError {
16    message: String,
17    name: Option<String>,
18}
19
20/// Alchemy error in response.
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct NestedError {
23    error: FlattenError,
24}
25
26impl std::fmt::Display for AlchemyError {
27    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
28        let err = match self {
29            AlchemyError::Nested(err) => &err.error,
30            AlchemyError::Flatten(err) => err,
31        };
32
33        match &err.name {
34            Some(name) => write!(f, "{}: {}", name, err.message),
35            None => write!(f, "{}", err.message),
36        }
37    }
38}
39
40impl std::error::Error for AlchemyError {
41    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
42        None
43    }
44
45    fn cause(&self) -> Option<&dyn std::error::Error> {
46        self.source()
47    }
48}