nautilus_deribit/websocket/
enums.rs1use serde::{Deserialize, Serialize};
19use strum::{AsRefStr, Display, EnumIter, EnumString};
20
21#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
26#[serde(rename_all = "snake_case")]
27pub enum DeribitUpdateInterval {
28 Raw,
31 #[default]
33 Ms100,
34 Agg2,
36}
37
38impl DeribitUpdateInterval {
39 #[must_use]
41 pub const fn as_str(&self) -> &'static str {
42 match self {
43 Self::Raw => "raw",
44 Self::Ms100 => "100ms",
45 Self::Agg2 => "agg2",
46 }
47 }
48
49 #[must_use]
51 pub const fn requires_auth(&self) -> bool {
52 matches!(self, Self::Raw)
53 }
54}
55
56impl std::fmt::Display for DeribitUpdateInterval {
57 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
58 write!(f, "{}", self.as_str())
59 }
60}
61
62#[derive(
66 Clone,
67 Debug,
68 Display,
69 PartialEq,
70 Eq,
71 Hash,
72 AsRefStr,
73 EnumIter,
74 EnumString,
75 Serialize,
76 Deserialize,
77)]
78pub enum DeribitWsChannel {
79 Trades,
82 Book,
84 Ticker,
86 Quote,
88 PriceIndex,
90 PriceRanking,
92 VolatilityIndex,
94 EstimatedExpirationPrice,
96 Perpetual,
98 MarkPriceOptions,
100 PlatformState,
102 Announcements,
104 ChartTrades,
106
107 UserOrders,
110 UserTrades,
112 UserPortfolio,
114 UserChanges,
116 UserAccessLog,
118}
119
120impl DeribitWsChannel {
121 #[must_use]
134 pub fn format_channel(
135 &self,
136 instrument_or_currency: &str,
137 interval: Option<DeribitUpdateInterval>,
138 ) -> String {
139 let interval_str = interval.unwrap_or_default().as_str();
140 match self {
141 Self::Trades => format!("trades.{instrument_or_currency}.{interval_str}"),
142 Self::Book => format!("book.{instrument_or_currency}.{interval_str}"),
143 Self::Ticker => format!("ticker.{instrument_or_currency}.{interval_str}"),
144 Self::Quote => format!("quote.{instrument_or_currency}"),
145 Self::PriceIndex => format!("deribit_price_index.{instrument_or_currency}"),
146 Self::PriceRanking => format!("deribit_price_ranking.{instrument_or_currency}"),
147 Self::VolatilityIndex => format!("deribit_volatility_index.{instrument_or_currency}"),
148 Self::EstimatedExpirationPrice => {
149 format!("estimated_expiration_price.{instrument_or_currency}")
150 }
151 Self::Perpetual => format!("perpetual.{instrument_or_currency}.{interval_str}"),
152 Self::MarkPriceOptions => format!("markprice.options.{instrument_or_currency}"),
153 Self::PlatformState => "platform_state".to_string(),
154 Self::Announcements => "announcements".to_string(),
155 Self::ChartTrades => format!("chart.trades.{instrument_or_currency}.{interval_str}"),
156 Self::UserOrders => format!("user.orders.{instrument_or_currency}.{interval_str}"),
157 Self::UserTrades => format!("user.trades.{instrument_or_currency}.{interval_str}"),
158 Self::UserPortfolio => format!("user.portfolio.{instrument_or_currency}"),
159 Self::UserChanges => format!("user.changes.{instrument_or_currency}.{interval_str}"),
160 Self::UserAccessLog => "user.access_log".to_string(),
161 }
162 }
163
164 #[must_use]
168 pub fn from_channel_string(channel: &str) -> Option<Self> {
169 if channel.starts_with("trades.") {
170 Some(Self::Trades)
171 } else if channel.starts_with("book.") {
172 Some(Self::Book)
173 } else if channel.starts_with("ticker.") {
174 Some(Self::Ticker)
175 } else if channel.starts_with("quote.") {
176 Some(Self::Quote)
177 } else if channel.starts_with("deribit_price_index.") {
178 Some(Self::PriceIndex)
179 } else if channel.starts_with("deribit_price_ranking.") {
180 Some(Self::PriceRanking)
181 } else if channel.starts_with("deribit_volatility_index.") {
182 Some(Self::VolatilityIndex)
183 } else if channel.starts_with("estimated_expiration_price.") {
184 Some(Self::EstimatedExpirationPrice)
185 } else if channel.starts_with("perpetual.") {
186 Some(Self::Perpetual)
187 } else if channel.starts_with("markprice.options.") {
188 Some(Self::MarkPriceOptions)
189 } else if channel == "platform_state" {
190 Some(Self::PlatformState)
191 } else if channel == "announcements" {
192 Some(Self::Announcements)
193 } else if channel.starts_with("chart.trades.") {
194 Some(Self::ChartTrades)
195 } else if channel.starts_with("user.orders.") {
196 Some(Self::UserOrders)
197 } else if channel.starts_with("user.trades.") {
198 Some(Self::UserTrades)
199 } else if channel.starts_with("user.portfolio.") {
200 Some(Self::UserPortfolio)
201 } else if channel.starts_with("user.changes.") {
202 Some(Self::UserChanges)
203 } else if channel == "user.access_log" {
204 Some(Self::UserAccessLog)
205 } else {
206 None
207 }
208 }
209
210 #[must_use]
212 pub const fn is_private(&self) -> bool {
213 matches!(
214 self,
215 Self::UserOrders
216 | Self::UserTrades
217 | Self::UserPortfolio
218 | Self::UserChanges
219 | Self::UserAccessLog
220 )
221 }
222}
223
224#[derive(
226 Clone,
227 Debug,
228 Display,
229 PartialEq,
230 Eq,
231 Hash,
232 AsRefStr,
233 EnumIter,
234 EnumString,
235 Serialize,
236 Deserialize,
237)]
238pub enum DeribitWsMethod {
239 #[serde(rename = "public/subscribe")]
242 #[strum(serialize = "public/subscribe")]
243 PublicSubscribe,
244 #[serde(rename = "public/unsubscribe")]
246 #[strum(serialize = "public/unsubscribe")]
247 PublicUnsubscribe,
248 #[serde(rename = "public/auth")]
250 #[strum(serialize = "public/auth")]
251 PublicAuth,
252 #[serde(rename = "public/set_heartbeat")]
254 #[strum(serialize = "public/set_heartbeat")]
255 SetHeartbeat,
256 #[serde(rename = "public/disable_heartbeat")]
258 #[strum(serialize = "public/disable_heartbeat")]
259 DisableHeartbeat,
260 #[serde(rename = "public/test")]
262 #[strum(serialize = "public/test")]
263 Test,
264 #[serde(rename = "public/hello")]
266 #[strum(serialize = "public/hello")]
267 Hello,
268 #[serde(rename = "public/get_time")]
270 #[strum(serialize = "public/get_time")]
271 GetTime,
272
273 #[serde(rename = "private/subscribe")]
276 #[strum(serialize = "private/subscribe")]
277 PrivateSubscribe,
278 #[serde(rename = "private/unsubscribe")]
280 #[strum(serialize = "private/unsubscribe")]
281 PrivateUnsubscribe,
282 #[serde(rename = "private/logout")]
284 #[strum(serialize = "private/logout")]
285 Logout,
286}
287
288impl DeribitWsMethod {
289 #[must_use]
291 pub fn as_method_str(&self) -> &'static str {
292 match self {
293 Self::PublicSubscribe => "public/subscribe",
294 Self::PublicUnsubscribe => "public/unsubscribe",
295 Self::PublicAuth => "public/auth",
296 Self::SetHeartbeat => "public/set_heartbeat",
297 Self::DisableHeartbeat => "public/disable_heartbeat",
298 Self::Test => "public/test",
299 Self::Hello => "public/hello",
300 Self::GetTime => "public/get_time",
301 Self::PrivateSubscribe => "private/subscribe",
302 Self::PrivateUnsubscribe => "private/unsubscribe",
303 Self::Logout => "private/logout",
304 }
305 }
306}
307
308#[derive(
310 Clone, Debug, Display, PartialEq, Eq, Hash, AsRefStr, EnumString, Serialize, Deserialize,
311)]
312#[serde(rename_all = "snake_case")]
313pub enum DeribitBookAction {
314 #[serde(rename = "new")]
316 New,
317 #[serde(rename = "change")]
319 Change,
320 #[serde(rename = "delete")]
322 Delete,
323}
324
325#[derive(
327 Clone, Debug, Display, PartialEq, Eq, Hash, AsRefStr, EnumString, Serialize, Deserialize,
328)]
329#[serde(rename_all = "snake_case")]
330pub enum DeribitBookMsgType {
331 #[serde(rename = "snapshot")]
333 Snapshot,
334 #[serde(rename = "change")]
336 Change,
337}
338
339#[derive(
341 Clone, Debug, Display, PartialEq, Eq, Hash, AsRefStr, EnumString, Serialize, Deserialize,
342)]
343#[serde(rename_all = "snake_case")]
344pub enum DeribitHeartbeatType {
345 #[serde(rename = "heartbeat")]
347 Heartbeat,
348 #[serde(rename = "test_request")]
350 TestRequest,
351}