drm_core/models/
order.rs

1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
5#[serde(rename_all = "lowercase")]
6pub enum OrderSide {
7    Buy,
8    Sell,
9}
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
12#[serde(rename_all = "snake_case")]
13pub enum OrderStatus {
14    Pending,
15    Open,
16    Filled,
17    PartiallyFilled,
18    Cancelled,
19    Rejected,
20}
21
22#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct Order {
24    pub id: String,
25    pub market_id: String,
26    pub outcome: String,
27    pub side: OrderSide,
28    pub price: f64,
29    pub size: f64,
30    pub filled: f64,
31    pub status: OrderStatus,
32    pub created_at: DateTime<Utc>,
33    #[serde(default, skip_serializing_if = "Option::is_none")]
34    pub updated_at: Option<DateTime<Utc>>,
35}
36
37impl Order {
38    pub fn remaining(&self) -> f64 {
39        self.size - self.filled
40    }
41
42    pub fn is_active(&self) -> bool {
43        matches!(
44            self.status,
45            OrderStatus::Open | OrderStatus::PartiallyFilled
46        )
47    }
48
49    pub fn is_filled(&self) -> bool {
50        self.status == OrderStatus::Filled || self.filled >= self.size
51    }
52
53    pub fn fill_percentage(&self) -> f64 {
54        if self.size == 0.0 {
55            return 0.0;
56        }
57        self.filled / self.size
58    }
59}