use crate::qudag_stubs::qudag_exchange;
use crate::qudag_stubs::qudag_exchange;
use crate::qudag_stubs::qudag_exchange;
use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::RwLock;
use serde::{Deserialize, Serialize};
use rust_decimal::Decimal;
use uuid::Uuid;
use crate::{Result, EconomyError};
pub struct ExchangeManager {
exchange: Exchange,
config: ExchangeConfig,
orders: Arc<RwLock<HashMap<String, Order>>>,
trades: Arc<RwLock<Vec<Trade>>>,
}
impl ExchangeManager {
pub async fn new(config: ExchangeConfig) -> Result<Self> {
let exchange = Exchange::new(config.clone()).await
.map_err(EconomyError::Exchange)?;
Ok(Self {
exchange,
config,
orders: Arc::new(RwLock::new(HashMap::new())),
trades: Arc::new(RwLock::new(Vec::new())),
})
}
pub async fn initialize(&mut self) -> Result<()> {
self.exchange.start().await.map_err(EconomyError::Exchange)?;
tracing::info!("Exchange manager initialized");
Ok(())
}
pub async fn place_order(
&mut self,
account_id: String,
order_type: OrderType,
base_token: String,
quote_token: String,
quantity: Decimal,
price: Decimal,
) -> Result<String> {
let order_id = Uuid::new_v4().to_string();
let order = self.exchange.place_order(
order_id.clone(),
account_id,
order_type,
base_token,
quote_token,
quantity,
price,
).await.map_err(EconomyError::Exchange)?;
self.orders.write().await.insert(order_id.clone(), order);
tracing::info!("Placed order: {}", order_id);
Ok(order_id)
}
pub async fn get_trade_count(&self) -> Result<u64> {
Ok(self.trades.read().await.len() as u64)
}
pub async fn get_active_order_count(&self) -> Result<u64> {
Ok(self.orders.read().await.len() as u64)
}
}