Skip to main content

polymarket_client/
error.rs

1use thiserror::Error;
2
3/// Top-level SDK error.
4#[derive(Debug, Error)]
5pub enum Error {
6    #[error(transparent)]
7    ListMarkets(#[from] ListMarketsError),
8    #[error(transparent)]
9    FetchMarket(#[from] FetchMarketError),
10    #[error(transparent)]
11    ListEvents(#[from] ListEventsError),
12    #[error(transparent)]
13    FetchMidpoint(#[from] FetchMidpointError),
14    #[error(transparent)]
15    FetchOrderBook(#[from] FetchOrderBookError),
16}
17
18#[derive(Debug, Error, Clone)]
19#[error("invalid input: {0}")]
20pub struct UserInputError(pub String);
21
22#[derive(Debug, Error, Clone, Copy)]
23#[error("rate limit exceeded")]
24pub struct RateLimitError;
25
26#[derive(Debug, Error, Clone)]
27#[error("request rejected with status {status}: {message}")]
28pub struct RequestRejectedError {
29    pub status: u16,
30    pub message: String,
31}
32
33#[derive(Debug, Error, Clone)]
34#[error("transport error: {0}")]
35pub struct TransportError(pub String);
36
37#[derive(Debug, Error, Clone)]
38#[error("unexpected response: {0}")]
39pub struct UnexpectedResponseError(pub String);
40
41macro_rules! action_error {
42    ($name:ident) => {
43        #[derive(Debug, Error, Clone)]
44        pub enum $name {
45            #[error(transparent)]
46            UserInput(#[from] UserInputError),
47            #[error(transparent)]
48            RateLimit(#[from] RateLimitError),
49            #[error(transparent)]
50            RequestRejected(#[from] RequestRejectedError),
51            #[error(transparent)]
52            Transport(#[from] TransportError),
53            #[error(transparent)]
54            UnexpectedResponse(#[from] UnexpectedResponseError),
55        }
56
57        impl $name {
58            #[must_use]
59            pub fn is_error(err: &(dyn std::error::Error + 'static)) -> bool {
60                err.downcast_ref::<Self>().is_some()
61                    || err.downcast_ref::<UserInputError>().is_some()
62                    || err.downcast_ref::<RateLimitError>().is_some()
63                    || err.downcast_ref::<RequestRejectedError>().is_some()
64                    || err.downcast_ref::<TransportError>().is_some()
65                    || err.downcast_ref::<UnexpectedResponseError>().is_some()
66            }
67        }
68    };
69}
70
71action_error!(ListMarketsError);
72action_error!(FetchMarketError);
73action_error!(ListEventsError);
74action_error!(FetchMidpointError);
75action_error!(FetchOrderBookError);
76
77impl From<reqwest::Error> for TransportError {
78    fn from(value: reqwest::Error) -> Self {
79        Self(value.to_string())
80    }
81}
82
83pub fn user_input(message: impl Into<String>) -> UserInputError {
84    UserInputError(message.into())
85}
86
87pub fn unexpected_response(message: impl Into<String>) -> UnexpectedResponseError {
88    UnexpectedResponseError(message.into())
89}