use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum WebSocketOperation {
Subscribe,
Unsubscribe,
Login,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSocketAuth {
#[serde(rename = "apiKey")]
pub api_key: String,
pub sign: String,
pub timestamp: String,
pub passphrase: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSocketChannel {
pub channel: String,
#[serde(rename = "instId", skip_serializing_if = "Option::is_none")]
pub instrument_id: Option<String>,
#[serde(flatten, skip_serializing_if = "HashMap::is_empty")]
pub args: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSocketSubscription {
pub channel: String,
#[serde(rename = "instId", skip_serializing_if = "Option::is_none")]
pub instrument_id: Option<String>,
#[serde(flatten, skip_serializing_if = "HashMap::is_empty")]
pub args: HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSocketRequest {
pub op: WebSocketOperation,
pub args: Vec<WebSocketSubscription>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSocketLoginRequest {
pub op: String,
pub args: Vec<WebSocketAuth>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebSocketResponse<T> {
pub event: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub msg: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub channel: Option<String>,
#[serde(rename = "instId", skip_serializing_if = "Option::is_none")]
pub instrument_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<T>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum WebSocketMessage<T> {
Response(WebSocketResponse<T>),
Data {
channel: String,
#[serde(rename = "instId")]
instrument_id: String,
data: T,
},
}