Skip to main content

kraken_api_client/spot/ws/messages/
admin.rs

1//! Admin WebSocket messages (heartbeat, status, ping/pong).
2
3use serde::{Deserialize, Serialize};
4
5/// Ping request message.
6#[derive(Debug, Clone, Serialize)]
7pub struct PingRequest {
8    /// Request ID for correlation.
9    #[serde(skip_serializing_if = "Option::is_none")]
10    pub req_id: Option<u64>,
11}
12
13impl PingRequest {
14    /// Create a new ping request.
15    pub fn new() -> Self {
16        Self { req_id: None }
17    }
18
19    /// Create a ping request with a request ID.
20    pub fn with_req_id(req_id: u64) -> Self {
21        Self {
22            req_id: Some(req_id),
23        }
24    }
25}
26
27impl Default for PingRequest {
28    fn default() -> Self {
29        Self::new()
30    }
31}
32
33/// Pong response message.
34#[derive(Debug, Clone, Deserialize)]
35pub struct PongResponse {
36    /// Request ID (if provided in ping).
37    #[serde(default)]
38    pub req_id: Option<u64>,
39    /// Time when message was received.
40    #[serde(default)]
41    pub time_in: Option<String>,
42    /// Time when message was sent.
43    #[serde(default)]
44    pub time_out: Option<String>,
45}
46
47/// Heartbeat message from server.
48#[derive(Debug, Clone, Deserialize)]
49pub struct Heartbeat {
50    /// Channel name (always "heartbeat").
51    pub channel: String,
52}
53
54/// System status message.
55#[derive(Debug, Clone, Deserialize)]
56pub struct SystemStatusMessage {
57    /// Channel name (always "status").
58    pub channel: String,
59    /// Status data.
60    pub data: Vec<SystemStatusData>,
61}
62
63/// System status data.
64#[derive(Debug, Clone, Deserialize)]
65pub struct SystemStatusData {
66    /// API version.
67    #[serde(default)]
68    pub api_version: Option<String>,
69    /// Connection ID.
70    #[serde(default)]
71    pub connection_id: Option<u64>,
72    /// System status.
73    pub system: String,
74    /// System version.
75    #[serde(default)]
76    pub version: Option<String>,
77}
78
79impl SystemStatusData {
80    /// Check if the system is online.
81    pub fn is_online(&self) -> bool {
82        self.system == "online"
83    }
84
85    /// Check if the system is in maintenance mode.
86    pub fn is_maintenance(&self) -> bool {
87        self.system == "maintenance"
88    }
89}