polymarket_client/
error.rs1use thiserror::Error;
2
3#[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}