1use crate::model::order::{OrderSide, OrderType, TimeInForce};
7use pretty_simple_display::{DebugPretty, DisplaySimple};
8
9use crate::model::request::{LinkedOrderType, TriggerFillCondition};
10use crate::prelude::{AdvancedOrderType, TriggerType};
11use serde::{Deserialize, Serialize};
12
13#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
15pub struct BuyOrderRequest {
16 pub instrument_name: String,
18 pub amount: Option<f64>,
20 pub contracts: Option<f64>,
22 pub type_: Option<OrderType>,
24 pub label: Option<String>,
26 pub price: Option<f64>,
28 pub time_in_force: Option<TimeInForce>,
30 pub display_amount: Option<f64>,
32 pub post_only: Option<bool>,
34 pub reject_post_only: Option<bool>,
36 pub reduce_only: Option<bool>,
38 pub trigger_price: Option<f64>,
40 pub trigger_offset: Option<f64>,
42 pub trigger: Option<TriggerType>,
44 pub advanced: Option<AdvancedOrderType>,
46 pub mmp: Option<bool>,
48 pub valid_until: Option<i64>,
50 pub linked_order_type: Option<LinkedOrderType>,
52 pub trigger_fill_condition: Option<TriggerFillCondition>,
54 pub otoco_config: Option<Vec<String>>,
56}
57
58#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
60pub struct SellOrderRequest {
61 pub instrument_name: String,
63 pub amount: f64,
65 pub price: Option<f64>,
67 pub label: Option<String>,
69 pub time_in_force: Option<TimeInForce>,
71 pub reduce_only: Option<bool>,
73 pub post_only: Option<bool>,
75 pub type_: Option<OrderType>,
77}
78
79#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
81pub struct EditOrderRequest {
82 pub order_id: String,
84 pub amount: Option<f64>,
86 pub price: Option<f64>,
88 pub post_only: Option<bool>,
90 pub reduce_only: Option<bool>,
92 pub time_in_force: Option<TimeInForce>,
94}
95
96#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
98pub struct MassQuoteItem {
99 pub instrument_name: String,
101 pub side: OrderSide,
103 pub amount: f64,
105 pub price: f64,
107}
108
109#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
111pub struct MassQuoteRequest {
112 pub items: Vec<MassQuoteItem>,
114 pub label: Option<String>,
116}
117
118#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
120pub struct TransferResult {
121 pub id: String,
123 pub status: String,
125}
126
127#[derive(DebugPretty, DisplaySimple, Clone, Serialize, Deserialize)]
129pub struct QuoteResult {
130 pub instrument_name: String,
132 pub success: bool,
134 pub error: Option<String>,
136}
137
138#[cfg(test)]
139mod tests {
140 use super::*;
141
142 #[test]
143 fn test_mass_quote_request() {
144 let item = MassQuoteItem {
145 instrument_name: "BTC-PERPETUAL".to_string(),
146 side: OrderSide::Buy,
147 amount: 10.0,
148 price: 50000.0,
149 };
150 let req = MassQuoteRequest {
151 items: vec![item],
152 label: Some("test".to_string()),
153 };
154 let json = serde_json::to_string(&req).unwrap();
155 let de: MassQuoteRequest = serde_json::from_str(&json).unwrap();
156 assert_eq!(de.items.len(), 1);
157 }
158}