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>;