use nautilus_network::http::{HttpClientError, StatusCode};
use serde::Deserialize;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum BuildError {
#[error("Missing required instrument ID")]
MissingInstId,
#[error("Missing required bar interval")]
MissingBar,
#[error("Cannot specify both 'after' and 'before' cursors")]
BothCursors,
#[error(
"Invalid time range: after_ms ({after_ms}) must be greater than before_ms ({before_ms})"
)]
InvalidTimeRange { after_ms: i64, before_ms: i64 },
#[error("Cursor timestamp appears to be in nanoseconds (> 13 digits)")]
CursorIsNanoseconds,
#[error("Limit exceeds maximum of 300")]
LimitTooHigh,
}
#[derive(Clone, Debug, Deserialize)]
pub struct OKXErrorResponse {
pub error: OKXErrorMessage,
}
#[derive(Clone, Debug, Deserialize)]
pub struct OKXErrorMessage {
pub message: String,
pub name: String,
}
#[derive(Debug, Error)]
pub enum OKXHttpError {
#[error("Missing credentials for authenticated request")]
MissingCredentials,
#[error("OKX error {error_code}: {message}")]
OkxError { error_code: String, message: String },
#[error("JSON error: {0}")]
JsonError(String),
#[error("Parameter validation error: {0}")]
ValidationError(String),
#[error("Request canceled: {0}")]
Canceled(String),
#[error("Network error: {0}")]
HttpClientError(#[from] HttpClientError),
#[error("Unexpected HTTP status code {status}: {body}")]
UnexpectedStatus { status: StatusCode, body: String },
}
impl From<String> for OKXHttpError {
fn from(error: String) -> Self {
Self::ValidationError(error)
}
}
impl From<serde_json::Error> for OKXHttpError {
fn from(error: serde_json::Error) -> Self {
Self::JsonError(error.to_string())
}
}