use crate::account::keys::ApiKey;
use crate::client::{Client, Http, SendError, Sent, SentBatch};
use crate::trade::error::TradeError;
use crate::trade::manage::{CancelAllOrders, CancelOrder, ModifyOrder};
use crate::trade::margin::{UpdateLeverage, UpdateMargin};
use crate::trade::orders::{CreateGroupedOrders, CreateOrder, Order};
use crate::utils::sign::{SignTxError, Tx};
use crate::utils::{Dec, MarginMode, MarketId, OrderRef};
fn refused(error: TradeError) -> SendError {
SendError::Sign(SignTxError::Bad(error.into()))
}
pub async fn place<H: Http>(client: &Client<H, ApiKey>, order: &Order) -> Result<Sent, SendError> {
client.send(&CreateOrder::new(*order)).await
}
pub async fn place_group<H: Http>(client: &Client<H, ApiKey>, group: &CreateGroupedOrders) -> Result<Sent, SendError> {
client.send(group).await
}
pub async fn cancel<H: Http>(
client: &Client<H, ApiKey>,
market: MarketId,
order: impl Into<OrderRef>,
) -> Result<Sent, SendError> {
client.send(&CancelOrder::new(market, order)).await
}
pub async fn cancel_all<H: Http>(client: &Client<H, ApiKey>) -> Result<Sent, SendError> {
client.send(&CancelAllOrders::now()).await
}
pub async fn cancel_all_in<H: Http>(client: &Client<H, ApiKey>, market: MarketId) -> Result<Sent, SendError> {
client.send(&CancelAllOrders::in_market(market)).await
}
pub async fn cancel_all_in_markets<H: Http>(
client: &Client<H, ApiKey>,
markets: &[MarketId],
) -> Result<SentBatch, SendError> {
let cancels = CancelAllOrders::in_markets(markets);
let txs: Vec<&dyn Tx> = cancels.iter().map(|cancel| cancel as &dyn Tx).collect();
client.send_batch(&txs).await
}
pub async fn schedule_cancel_all<H: Http>(client: &Client<H, ApiKey>, at: u64) -> Result<Sent, SendError> {
let scheduled = CancelAllOrders::scheduled(at, client.now_ms()).map_err(refused)?;
client.send(&scheduled).await
}
pub async fn abort_cancel_all<H: Http>(client: &Client<H, ApiKey>) -> Result<Sent, SendError> {
client.send(&CancelAllOrders::abort()).await
}
pub async fn modify<H: Http>(client: &Client<H, ApiKey>, modify: &ModifyOrder) -> Result<Sent, SendError> {
client.send(modify).await
}
pub async fn set_leverage<H: Http>(
client: &Client<H, ApiKey>,
market: MarketId,
leverage: u16,
mode: MarginMode,
) -> Result<Sent, SendError> {
let update = UpdateLeverage::new(market, leverage, mode).map_err(refused)?;
client.send(&update).await
}
pub async fn add_margin<H: Http>(client: &Client<H, ApiKey>, market: MarketId, amount: Dec) -> Result<Sent, SendError> {
let update = UpdateMargin::add(market, amount).map_err(refused)?;
client.send(&update).await
}
pub async fn remove_margin<H: Http>(
client: &Client<H, ApiKey>,
market: MarketId,
amount: Dec,
) -> Result<Sent, SendError> {
let update = UpdateMargin::remove(market, amount).map_err(refused)?;
client.send(&update).await
}
#[cfg(test)]
#[path = "tests/send.rs"]
mod tests;