use reqwest::StatusCode;
use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum FyersError {
#[error("request failed: {0}")]
Request(#[from] reqwest::Error),
#[error("http error {status}: {body}")]
HttpStatus {
status: StatusCode,
body: String,
},
#[error("token expired")]
TokenExpired,
#[error("invalid token")]
InvalidToken,
#[error("invalid parameters: {0}")]
InvalidParams(String),
#[error("invalid symbol")]
InvalidSymbol,
#[error("invalid order id")]
InvalidOrderId,
#[error("invalid position id")]
InvalidPositionId,
#[error("rate limit exceeded")]
RateLimited,
#[error("fyers api error {code}: {message}")]
Api {
code: i32,
message: String,
},
#[error("json error: {0}")]
Json(#[from] serde_json::Error),
#[error("missing field: '{0}' in success response")]
MissingField(&'static str),
}
impl FyersError {
pub(crate) fn map_api_error(code: i32, message: String) -> FyersError {
match code {
-8 => FyersError::TokenExpired,
-17..=-15 => FyersError::InvalidToken,
-50 | 400 => FyersError::InvalidParams(message),
-51 => FyersError::InvalidOrderId,
-53 => FyersError::InvalidPositionId,
-300 => FyersError::InvalidSymbol,
-429 => FyersError::RateLimited,
_ => FyersError::Api { code, message },
}
}
}