use serde::Deserialize;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum WattpadError {
#[error("Network or request error: {0}")]
RequestError(#[from] reqwest::Error),
#[error("Failed to parse JSON response: {0}")]
ParseError(#[from] serde_json::Error),
#[error("Authentication failed: Invalid credentials or missing cookies.")]
AuthenticationFailed,
#[error("Authentication required for '{field}': {context}")]
AuthenticationRequired {
field: String,
context: String,
},
#[error("Missing a required field: '{field}'. Context: {context}")]
MissingRequiredField {
field: String,
context: String,
},
#[error("API Error 1014: User not found.")]
UserNotFound,
#[error("API Error 1017: Story not found.")]
StoryNotFound,
#[error("API Error 1018: Permission Denied. User not logged in.")]
PermissionDeniedNotLoggedIn,
#[error("API Error 1154: Access Denied.")]
AccessDenied,
#[error("API Error {code} ({error_type}): {message}")]
ApiError {
code: i64,
error_type: String,
message: String,
},
}
#[derive(Deserialize)]
pub(crate) struct ApiErrorResponse {
pub code: i64,
#[serde(rename = "error")]
pub error_type: String,
pub message: String,
}
impl From<ApiErrorResponse> for WattpadError {
fn from(res: ApiErrorResponse) -> Self {
match res.code {
1014 => WattpadError::UserNotFound,
1017 => WattpadError::StoryNotFound,
1018 => WattpadError::PermissionDeniedNotLoggedIn,
1154 => WattpadError::AccessDenied,
_ => WattpadError::ApiError {
code: res.code,
error_type: res.error_type,
message: res.message,
},
}
}
}