1use serde::{Deserialize, Serialize};
2use thiserror::Error;
3
4#[derive(Clone, Serialize, Deserialize, Debug)]
5pub struct ErrorResponse {
6 pub code: String,
7 pub message: String,
8 pub log_id: String,
9}
10
11#[derive(Error, Debug)]
12pub enum TikTokApiError {
13 #[error("Access token is invalid or not found in the request. Please refresh the token and retry. Log ID: {0}")]
14 AccessTokenInvalid(String),
15
16 #[error("This is the generic error code for TikTok internal errors. Please refer to the error message for details and notify TikTok support. Log ID: {0}")]
17 InternalError(String),
18
19 #[error("The uploaded file does not meet API specifications. Please correct the file and try again. Log ID: {0}")]
20 InvalidFileUpload(String),
21
22 #[error("One or more fields in request is invalid. Please refer to the error message for details. Log ID: {0}")]
23 InvalidParams(String),
24
25 #[error("The API rate limit was exceeded. Please try again later. Log ID: {0}")]
26 RateLimitExceeded(String),
27
28 #[error("The user did not authorize the scope required for completing this request. Please ask the user to authorize and then retry. Log ID: {0}")]
29 ScopeNotAuthorized(String),
30
31 #[error("Access token is invalid, some fields need additional scopes. Please refer to the error message for more details. Log ID: {0}")]
32 ScopePermissionMissed(String),
33
34 #[error("Request failed: {0}")]
35 RequestFailed(String),
36
37 #[error("Response read failed: {0}")]
38 ResponseReadFailed(String),
39
40 #[error("Parse failed: {0}")]
41 ParseFailed(String),
42
43 #[error("API error: {0}, Description: {1}, Log ID: {2}")]
44 ApiError(String, String, String),
45
46 #[error("Unknown error occurred. Code: {0}, Message: {1}, Log ID: {2}")]
47 Unknown(String, String, String),
48}
49
50impl From<ErrorResponse> for TikTokApiError {
52 fn from(error: ErrorResponse) -> Self {
53 match error.code.as_str() {
54 "access_token_invalid" => TikTokApiError::AccessTokenInvalid(error.log_id),
55 "internal_error" => TikTokApiError::InternalError(error.log_id),
56 "invalid_file_upload" => TikTokApiError::InvalidFileUpload(error.log_id),
57 "invalid_params" => TikTokApiError::InvalidParams(error.log_id),
58 "rate_limit_exceeded" => TikTokApiError::RateLimitExceeded(error.log_id),
59 "scope_not_authorized" => TikTokApiError::ScopeNotAuthorized(error.log_id),
60 "scope_permission_missed" => TikTokApiError::ScopePermissionMissed(error.log_id),
61 _ => TikTokApiError::Unknown(error.code, error.message, error.log_id),
62 }
63 }
64}