1use std::error;
4use std::fmt;
5
6use serde::Deserialize;
7
8use crate::ErrorResponse;
9
10#[derive(Debug, Deserialize)]
11#[non_exhaustive]
12#[serde(rename_all = "snake_case")]
13pub enum ErrorType {
14 RequestError,
15 ApiError,
16}
17
18#[derive(Debug, Deserialize)]
19pub struct ValidationError {
20 pub field: String,
21 pub message: String,
22}
23
24#[derive(Debug, Deserialize)]
25pub struct PaddleError {
26 #[serde(rename = "type")]
27 pub error_type: ErrorType,
28 pub code: String,
29 pub detail: String,
30 pub documentation_url: String,
31 pub errors: Option<Vec<ValidationError>>,
32}
33
34#[derive(Debug)]
35pub enum Error {
36 Request(reqwest::Error),
37 Url(url::ParseError),
38 Paddle(ErrorResponse),
39}
40
41impl fmt::Display for Error {
42 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
43 match self {
44 Self::Request(err) => write!(f, "Request error: {}", err),
45 Self::Url(err) => write!(f, "URL error: {}", err),
46 Self::Paddle(err) => write!(f, "Paddle error: {}", err.error.detail),
47 }
48 }
49}
50
51impl error::Error for Error {
52 fn source(&self) -> Option<&(dyn error::Error + 'static)> {
53 match self {
54 Self::Request(err) => Some(err),
55 Self::Url(err) => Some(err),
56 Self::Paddle(_) => None,
57 }
58 }
59}
60
61impl From<reqwest::Error> for Error {
62 fn from(err: reqwest::Error) -> Self {
63 Self::Request(err)
64 }
65}
66
67impl From<url::ParseError> for Error {
68 fn from(err: url::ParseError) -> Self {
69 Self::Url(err)
70 }
71}