deribit_http/model/
instrument.rs1use pretty_simple_display::{DebugPretty, DisplaySimple};
7use serde::{Deserialize, Serialize};
8use serde_with::skip_serializing_none;
9use std::fmt::Display;
10
11#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
13#[serde(rename_all = "lowercase")]
14pub enum InstrumentKind {
15 Future,
17 Option,
19 Spot,
21 #[serde(rename = "future_combo")]
23 FutureCombo,
24 #[serde(rename = "option_combo")]
26 OptionCombo,
27}
28
29impl Display for InstrumentKind {
30 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
31 match self {
32 InstrumentKind::Future => write!(f, "future"),
33 InstrumentKind::Option => write!(f, "option"),
34 InstrumentKind::Spot => write!(f, "spot"),
35 InstrumentKind::FutureCombo => write!(f, "future_combo"),
36 InstrumentKind::OptionCombo => write!(f, "option_combo"),
37 }
38 }
39}
40
41#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
43#[serde(rename_all = "lowercase")]
44pub enum InstrumentType {
45 Linear,
47 Reversed,
49}
50
51#[skip_serializing_none]
53#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize, Default)]
54pub struct Instrument {
55 pub instrument_name: String,
57 pub price_index: Option<String>,
59 pub kind: Option<InstrumentKind>,
61 pub currency: Option<String>,
63 pub is_active: Option<bool>,
65 pub expiration_timestamp: Option<i64>,
67 pub strike: Option<f64>,
69 pub option_type: Option<OptionType>,
71 pub tick_size: Option<f64>,
73 pub min_trade_amount: Option<f64>,
75 pub contract_size: Option<f64>,
77 pub settlement_period: Option<String>,
79 pub instrument_type: Option<InstrumentType>,
81 pub quote_currency: Option<String>,
83 pub settlement_currency: Option<String>,
85 pub creation_timestamp: Option<i64>,
87 pub max_leverage: Option<f64>,
89 pub maker_commission: Option<f64>,
91 pub taker_commission: Option<f64>,
93 pub instrument_id: Option<u32>,
95 pub base_currency: Option<String>,
97 pub counter_currency: Option<String>,
99}
100
101impl Instrument {
102 pub fn is_perpetual(&self) -> bool {
104 self.expiration_timestamp.is_none()
105 && self
106 .kind
107 .as_ref()
108 .is_some_and(|k| matches!(k, InstrumentKind::Future))
109 }
110
111 pub fn is_option(&self) -> bool {
113 self.kind
114 .as_ref()
115 .is_some_and(|k| matches!(k, InstrumentKind::Option | InstrumentKind::OptionCombo))
116 }
117
118 pub fn is_future(&self) -> bool {
120 self.kind
121 .as_ref()
122 .is_some_and(|k| matches!(k, InstrumentKind::Future | InstrumentKind::FutureCombo))
123 }
124
125 pub fn is_spot(&self) -> bool {
127 self.kind
128 .as_ref()
129 .is_some_and(|k| matches!(k, InstrumentKind::Spot))
130 }
131}
132
133#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
135#[serde(rename_all = "lowercase")]
136pub enum OptionType {
137 Call,
139 Put,
141}