barter_execution/simulated/execution/
mod.rsuse crate::{
model::order::{Cancelled, Open, Order},
simulated::SimulatedEvent,
AccountEvent, ExecutionClient, ExecutionError, ExecutionId, RequestCancel, RequestOpen,
SymbolBalance,
};
use async_trait::async_trait;
use tokio::sync::{mpsc, oneshot};
#[derive(Clone, Debug)]
pub struct SimulatedExecution {
pub request_tx: mpsc::UnboundedSender<SimulatedEvent>,
}
#[async_trait]
impl ExecutionClient for SimulatedExecution {
const CLIENT: ExecutionId = ExecutionId::Simulated;
type Config = mpsc::UnboundedSender<SimulatedEvent>;
async fn init(request_tx: Self::Config, _: mpsc::UnboundedSender<AccountEvent>) -> Self {
Self { request_tx }
}
async fn fetch_orders_open(&self) -> Result<Vec<Order<Open>>, ExecutionError> {
let (response_tx, response_rx) = oneshot::channel();
self.request_tx
.send(SimulatedEvent::FetchOrdersOpen(response_tx))
.expect("SimulatedExchange is offline - failed to send FetchOrdersOpen request");
response_rx
.await
.expect("SimulatedExchange is offline - failed to receive FetchOrdersOpen response")
}
async fn fetch_balances(&self) -> Result<Vec<SymbolBalance>, ExecutionError> {
let (response_tx, response_rx) = oneshot::channel();
self.request_tx
.send(SimulatedEvent::FetchBalances(response_tx))
.expect("SimulatedExchange is offline - failed to send FetchBalances request");
response_rx
.await
.expect("SimulatedExchange is offline - failed to receive FetchBalances response")
}
async fn open_orders(
&self,
open_requests: Vec<Order<RequestOpen>>,
) -> Vec<Result<Order<Open>, ExecutionError>> {
let (response_tx, response_rx) = oneshot::channel();
self.request_tx
.send(SimulatedEvent::OpenOrders((open_requests, response_tx)))
.expect("SimulatedExchange is offline - failed to send OpenOrders request");
response_rx
.await
.expect("SimulatedExchange is offline - failed to receive OpenOrders response")
}
async fn cancel_orders(
&self,
cancel_requests: Vec<Order<RequestCancel>>,
) -> Vec<Result<Order<Cancelled>, ExecutionError>> {
let (response_tx, response_rx) = oneshot::channel();
self.request_tx
.send(SimulatedEvent::CancelOrders((cancel_requests, response_tx)))
.expect("SimulatedExchange is offline - failed to send CancelOrders request");
response_rx
.await
.expect("SimulatedExchange is offline - failed to receive CancelOrders response")
}
async fn cancel_orders_all(&self) -> Result<Vec<Order<Cancelled>>, ExecutionError> {
let (response_tx, response_rx) = oneshot::channel();
self.request_tx
.send(SimulatedEvent::CancelOrdersAll(response_tx))
.expect("SimulatedExchange is offline - failed to send CancelOrdersAll request");
response_rx
.await
.expect("SimulatedExchange is offline - failed to receive CancelOrdersAll response")
}
}