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}