#[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
pub enum OrderSide {
Buy,
#[default]
Sell,
}
impl AsRef<str> for OrderSide {
fn as_ref(&self) -> &str {
match self {
OrderSide::Buy => "buy",
OrderSide::Sell => "sell",
}
}
}
impl ToString for OrderSide {
fn to_string(&self) -> String {
self.as_ref().to_string()
}
}
#[derive(Default, Debug, Clone, Copy)]
pub enum OrderType {
#[default]
Limit,
Market,
}
impl ToString for OrderType {
fn to_string(&self) -> String {
match self {
OrderType::Limit => "limit",
OrderType::Market => "market",
}
.to_string()
}
}
pub trait Order {
fn id(&self) -> u128;
fn side(&self) -> OrderSide;
fn symbol(&self) -> String;
fn amount(&self) -> String;
fn order_type(&self) -> OrderType;
}
#[derive(Debug, Clone)]
pub struct MarketOrder {
id: u128,
order_type: OrderType,
side: OrderSide,
symbol: String,
amount: String,
}
impl Order for MarketOrder {
fn id(&self) -> u128 {
self.id
}
fn order_type(&self) -> OrderType {
self.order_type
}
fn side(&self) -> OrderSide {
self.side
}
fn symbol(&self) -> String {
self.symbol.clone()
}
fn amount(&self) -> String {
self.amount.clone()
}
}
#[derive(Debug, Clone)]
pub struct LimitOrder {
pub id: u128,
pub order_type: OrderType,
pub side: OrderSide,
pub symbol: String,
pub amount: String,
pub price: String,
}
impl Order for LimitOrder {
fn id(&self) -> u128 {
self.id
}
fn order_type(&self) -> OrderType {
self.order_type
}
fn side(&self) -> OrderSide {
self.side
}
fn symbol(&self) -> String {
self.symbol.clone()
}
fn amount(&self) -> String {
self.amount.clone()
}
}
impl LimitOrder {
pub fn price(&self) -> String {
self.price.clone()
}
}