use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize)]
pub struct WsRequest {
pub req_id: String,
pub op: String,
pub args: Vec<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct WsAuthRequest {
pub req_id: String,
pub op: String,
pub args: Vec<serde_json::Value>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct WsResponse {
#[serde(default)]
pub success: Option<bool>,
#[serde(default)]
pub ret_msg: Option<String>,
#[serde(default)]
pub conn_id: Option<String>,
#[serde(default)]
pub req_id: Option<String>,
#[serde(default)]
pub op: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct WsMessage {
pub topic: String,
#[serde(rename = "type")]
pub msg_type: Option<String>,
pub ts: Option<u64>,
pub data: serde_json::Value,
}
#[derive(Debug, Clone, Serialize)]
pub struct WsPing {
pub req_id: String,
pub op: String,
}
impl WsPing {
pub fn new() -> Self {
Self {
req_id: uuid::Uuid::new_v4().to_string(),
op: "ping".to_string(),
}
}
}
impl Default for WsPing {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct WsPong {
#[serde(default)]
pub success: Option<bool>,
#[serde(default)]
pub ret_msg: Option<String>,
#[serde(default)]
pub conn_id: Option<String>,
#[serde(default)]
pub req_id: Option<String>,
#[serde(default)]
pub op: Option<String>,
}
pub fn is_pong(msg: &serde_json::Value) -> bool {
if let Some(op) = msg.get("op").and_then(|v| v.as_str()) {
return op == "pong";
}
if let Some(ret_msg) = msg.get("ret_msg").and_then(|v| v.as_str()) {
return ret_msg == "pong";
}
false
}
pub fn is_auth_response(msg: &serde_json::Value) -> bool {
msg.get("op")
.and_then(|v| v.as_str())
.map(|op| op == "auth")
.unwrap_or(false)
}
pub fn is_subscription_response(msg: &serde_json::Value) -> bool {
msg.get("op")
.and_then(|v| v.as_str())
.map(|op| op == "subscribe")
.unwrap_or(false)
}
pub fn is_data_message(msg: &serde_json::Value) -> bool {
msg.get("topic").is_some()
}