paddle_rust_sdk/
error.rs

1//! Error handling module for Paddle API client
2
3use 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}