ft_rs/
error.rs

1use std::str::FromStr;
2
3use serde::Deserialize;
4use thiserror::Error;
5
6#[derive(Debug, Deserialize)]
7pub enum ErrorType {
8  #[serde(rename = "invalid_client")]
9  InvalidClient,
10  #[serde(rename = "invalid_grant")]
11  InvalidGrant,
12  #[serde(rename = "invalid_request")]
13  InvalidRequest,
14  #[serde(rename = "invalid_scope")]
15  InvalidScope,
16  #[serde(rename = "unauthorized_client")]
17  UnauthorizedClient,
18  #[serde(rename = "unsupported_grant_type")]
19  UnsupportedGrantType,
20  #[serde(rename = "unknown")]
21  Unknown
22}
23
24impl FromStr for ErrorType {
25  type Err = FtError;
26
27  fn from_str(s: &str) -> std::prelude::v1::Result<Self, Self::Err> {
28    Ok(serde_json::from_str::<ErrorType>(format!("\"{}\"", s).as_str()).unwrap_or(ErrorType::Unknown))
29  }
30}
31
32#[derive(Debug, Error)]
33pub enum FtError {
34  #[error("Couldn't build the reqwest client")]
35  ReqwestBuilderError(reqwest::Error),
36  #[error("Error while sending request")]
37  ReqwestError(#[from] reqwest::Error),
38  #[error("Error while deserializing API response")]
39  SerdeError {
40    #[from]
41    source: serde_json::Error
42  },
43  #[error("API error: {error:?}: {error_description:?}")]
44  ApiError {
45    error: ErrorType,
46    error_description: String
47  },
48}
49
50impl FtError {
51  pub fn from_api_error(error: ErrorType, error_description: String) -> Self {
52    Self::ApiError {
53      error,
54      error_description
55    }
56  }
57}
58
59pub type Result<T> = std::result::Result<T, FtError>;