Skip to main content

tiktok_rust/error/
mod.rs

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
50// Function to map error response to custom error
51impl 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}