deribit_websocket/message/
request.rs

1//! WebSocket request message handling
2
3use crate::model::{quote::*, ws_types::JsonRpcRequest};
4
5/// Request builder for WebSocket messages
6#[derive(Debug, Clone)]
7pub struct RequestBuilder {
8    id_counter: u64,
9}
10
11impl Default for RequestBuilder {
12    fn default() -> Self {
13        Self::new()
14    }
15}
16
17impl RequestBuilder {
18    /// Create a new request builder
19    pub fn new() -> Self {
20        Self { id_counter: 1 }
21    }
22
23    /// Build a JSON-RPC request
24    pub fn build_request(
25        &mut self,
26        method: &str,
27        params: Option<serde_json::Value>,
28    ) -> JsonRpcRequest {
29        let id = self.id_counter;
30        self.id_counter += 1;
31
32        JsonRpcRequest {
33            jsonrpc: "2.0".to_string(),
34            id: serde_json::Value::Number(serde_json::Number::from(id)),
35            method: method.to_string(),
36            params,
37        }
38    }
39
40    /// Build authentication request
41    pub fn build_auth_request(&mut self, client_id: &str, client_secret: &str) -> JsonRpcRequest {
42        let params = serde_json::json!({
43            "grant_type": "client_credentials",
44            "client_id": client_id,
45            "client_secret": client_secret
46        });
47
48        self.build_request("public/auth", Some(params))
49    }
50
51    /// Build subscription request
52    pub fn build_subscribe_request(&mut self, channels: Vec<String>) -> JsonRpcRequest {
53        let params = serde_json::json!({
54            "channels": channels
55        });
56
57        self.build_request("public/subscribe", Some(params))
58    }
59
60    /// Build unsubscription request
61    pub fn build_unsubscribe_request(&mut self, channels: Vec<String>) -> JsonRpcRequest {
62        let params = serde_json::json!({
63            "channels": channels
64        });
65
66        self.build_request("public/unsubscribe", Some(params))
67    }
68
69    /// Build test request
70    pub fn build_test_request(&mut self) -> JsonRpcRequest {
71        self.build_request("public/test", None)
72    }
73
74    /// Build get time request
75    pub fn build_get_time_request(&mut self) -> JsonRpcRequest {
76        self.build_request("public/get_time", None)
77    }
78
79    /// Build mass quote request
80    pub fn build_mass_quote_request(&mut self, request: MassQuoteRequest) -> JsonRpcRequest {
81        let params = serde_json::to_value(request).expect("Failed to serialize mass quote request");
82
83        self.build_request("private/mass_quote", Some(params))
84    }
85
86    /// Build cancel quotes request
87    pub fn build_cancel_quotes_request(&mut self, request: CancelQuotesRequest) -> JsonRpcRequest {
88        let params =
89            serde_json::to_value(request).expect("Failed to serialize cancel quotes request");
90
91        self.build_request("private/cancel_quotes", Some(params))
92    }
93
94    /// Build set MMP config request
95    pub fn build_set_mmp_config_request(&mut self, config: MmpGroupConfig) -> JsonRpcRequest {
96        let mut params = serde_json::json!({
97            "mmp_group": config.mmp_group,
98            "quantity_limit": config.quantity_limit,
99            "delta_limit": config.delta_limit,
100            "interval": config.interval,
101            "frozen_time": config.frozen_time
102        });
103
104        // If interval is 0, this disables the group
105        if config.interval == 0 {
106            params["interval"] = serde_json::Value::Number(serde_json::Number::from(0));
107        }
108
109        self.build_request("private/set_mmp_config", Some(params))
110    }
111
112    /// Build get MMP config request
113    pub fn build_get_mmp_config_request(&mut self, mmp_group: Option<String>) -> JsonRpcRequest {
114        let params = if let Some(group) = mmp_group {
115            serde_json::json!({
116                "mmp_group": group
117            })
118        } else {
119            serde_json::json!({})
120        };
121
122        self.build_request("private/get_mmp_config", Some(params))
123    }
124
125    /// Build reset MMP request
126    pub fn build_reset_mmp_request(&mut self, mmp_group: Option<String>) -> JsonRpcRequest {
127        let params = if let Some(group) = mmp_group {
128            serde_json::json!({
129                "mmp_group": group
130            })
131        } else {
132            serde_json::json!({})
133        };
134
135        self.build_request("private/reset_mmp", Some(params))
136    }
137
138    /// Build get open orders request
139    pub fn build_get_open_orders_request(
140        &mut self,
141        currency: Option<String>,
142        kind: Option<String>,
143        type_filter: Option<String>,
144    ) -> JsonRpcRequest {
145        let mut params = serde_json::json!({});
146
147        if let Some(currency) = currency {
148            params["currency"] = serde_json::Value::String(currency);
149        }
150        if let Some(kind) = kind {
151            params["kind"] = serde_json::Value::String(kind);
152        }
153        if let Some(type_filter) = type_filter {
154            params["type"] = serde_json::Value::String(type_filter);
155        }
156
157        self.build_request("private/get_open_orders", Some(params))
158    }
159}