Skip to main content

fx_utils/
types.rs

1//! Common types used across the platform
2
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6/// Unique identifier for orders
7pub type OrderId = Uuid;
8
9/// Unique identifier for trades
10pub type TradeId = Uuid;
11
12/// Unique identifier for instruments
13pub type InstrumentId = String;
14
15/// Currency pair (e.g., "EURUSD", "GBPUSD")
16#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
17pub struct CurrencyPair {
18    pub base: String,
19    pub quote: String,
20}
21
22impl CurrencyPair {
23    pub fn new(base: impl Into<String>, quote: impl Into<String>) -> Self {
24        Self {
25            base: base.into(),
26            quote: quote.into(),
27        }
28    }
29
30    pub fn as_string(&self) -> String {
31        format!("{}{}", self.base, self.quote)
32    }
33}
34
35/// Price representation (fixed-point for precision)
36#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
37pub struct Price(pub u64);
38
39impl Price {
40    /// Create a price from a decimal representation
41    /// Example: Price::from_decimal(1.2345, 4) = 12345
42    pub fn from_decimal(value: f64, decimals: u8) -> Self {
43        let multiplier = 10_u64.pow(decimals as u32);
44        Self((value * multiplier as f64) as u64)
45    }
46
47    /// Convert price to decimal
48    pub fn to_decimal(self, decimals: u8) -> f64 {
49        let divisor = 10_u64.pow(decimals as u32);
50        self.0 as f64 / divisor as f64
51    }
52}
53
54/// Quantity representation
55#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
56pub struct Quantity(pub u64);
57
58/// Side of an order (Buy or Sell)
59#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
60pub enum Side {
61    Buy,
62    Sell,
63}
64
65/// Order type
66#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
67pub enum OrderType {
68    Market,
69    Limit,
70    Stop,
71    IoC, // Immediate or Cancel
72    FoK, // Fill or Kill
73}