use reqwest;
use serde::Deserialize;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum InkittError {
#[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: Login rejected by Inkitt! 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 InkittError {
fn from(res: ApiErrorResponse) -> Self {
match res.code {
1014 => InkittError::UserNotFound,
1017 => InkittError::StoryNotFound,
1018 => InkittError::PermissionDeniedNotLoggedIn,
1154 => InkittError::AccessDenied,
_ => InkittError::ApiError {
code: res.code,
error_type: res.error_type,
message: res.message,
},
}
}
}