1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
use super::types::PlaceOrderResponse;
use crate::graphql::place_limit_order;
use crate::graphql::place_market_order;
use crate::types::{BuyOrSell, OrderStatus, OrderType};
use chrono::{DateTime, Utc};
use std::str::FromStr;
use crate::protocol::place_order::types::MarketName;
impl From<place_limit_order::ResponseData> for PlaceOrderResponse {
fn from(response: place_limit_order::ResponseData) -> Self {
let response = response.place_limit_order;
Self {
status: response.status.into(),
order_id: response.id,
remaining_orders: response.orders_till_sign_state as u64,
placed_at: DateTime::<Utc>::from_str(&response.placed_at)
.expect("ME returned invalid placed_at DateTime for PlaceOrderResponse"),
order_type: response.type_.into(),
buy_or_sell: response.buy_or_sell.into(),
market: MarketName {
name: response.market.name.clone()
}
}
}
}
impl From<place_limit_order::OrderStatus> for OrderStatus {
fn from(status: place_limit_order::OrderStatus) -> Self {
match status {
place_limit_order::OrderStatus::PENDING => Self::Pending,
place_limit_order::OrderStatus::CANCELLED => Self::Canceled,
place_limit_order::OrderStatus::OPEN => Self::Open,
place_limit_order::OrderStatus::FILLED => Self::Filled,
place_limit_order::OrderStatus::Other(_) => {
panic!("Order status set to something invalid")
}
}
}
}
impl From<place_limit_order::OrderBuyOrSell> for BuyOrSell {
fn from(response: place_limit_order::OrderBuyOrSell) -> Self {
match response {
place_limit_order::OrderBuyOrSell::BUY => Self::Buy,
place_limit_order::OrderBuyOrSell::SELL => Self::Sell,
_ => panic!("Unexpected value in BuyOrSell enum"),
}
}
}
impl From<place_limit_order::OrderType> for OrderType {
fn from(response: place_limit_order::OrderType) -> Self {
match response {
place_limit_order::OrderType::MARKET => Self::Market,
place_limit_order::OrderType::LIMIT => Self::Limit,
place_limit_order::OrderType::STOP_MARKET => Self::StopMarket,
place_limit_order::OrderType::STOP_LIMIT => Self::StopLimit,
_ => panic!("Unexpected value in OrderType enum"),
}
}
}
impl From<place_market_order::ResponseData> for PlaceOrderResponse {
fn from(response: place_market_order::ResponseData) -> Self {
let response = response.place_market_order;
Self {
status: response.status.into(),
order_id: response.id,
remaining_orders: response.orders_till_sign_state as u64,
placed_at: DateTime::<Utc>::from_str(&response.placed_at)
.expect("ME returned invalid placed_at DateTime for PlaceOrderResponse"),
order_type: OrderType::Market,
buy_or_sell: response.buy_or_sell.into(),
market: MarketName {
name: response.market.name.clone()
},
}
}
}
impl From<place_market_order::OrderStatus> for OrderStatus {
fn from(status: place_market_order::OrderStatus) -> Self {
match status {
place_market_order::OrderStatus::PENDING => Self::Pending,
place_market_order::OrderStatus::CANCELLED => Self::Canceled,
place_market_order::OrderStatus::OPEN => Self::Open,
place_market_order::OrderStatus::FILLED => Self::Filled,
place_market_order::OrderStatus::Other(_) => {
panic!("Order status set to something invalid")
}
}
}
}
impl From<place_market_order::OrderBuyOrSell> for BuyOrSell {
fn from(response: place_market_order::OrderBuyOrSell) -> Self {
match response {
place_market_order::OrderBuyOrSell::BUY => Self::Buy,
place_market_order::OrderBuyOrSell::SELL => Self::Sell,
_ => panic!("Unexpected value in BuyOrSell enum"),
}
}
}