use reqwest::Client;
use serde::{Deserialize, Serialize};
use url::Url;
use crate::{
account::{Credentials, Signer, Wallet},
error::Result,
request::{AuthMode, Request},
types::SignedOrder,
};
#[derive(Clone)]
pub struct Orders {
pub(crate) client: Client,
pub(crate) base_url: Url,
pub(crate) wallet: Wallet,
pub(crate) credentials: Credentials,
pub(crate) signer: Signer,
pub(crate) chain_id: u64,
}
impl Orders {
pub fn list(&self) -> Request<Vec<OpenOrder>> {
Request::get(
self.client.clone(),
self.base_url.clone(),
"/data/orders",
AuthMode::L2 {
address: self.wallet.address(),
credentials: self.credentials.clone(),
signer: self.signer.clone(),
},
self.chain_id,
)
}
pub fn cancel(&self, order_id: impl Into<String>) -> CancelOrderRequest {
CancelOrderRequest {
client: self.client.clone(),
base_url: self.base_url.clone(),
auth: AuthMode::L2 {
address: self.wallet.address(),
credentials: self.credentials.clone(),
signer: self.signer.clone(),
},
chain_id: self.chain_id,
order_id: order_id.into(),
}
}
}
pub struct CancelOrderRequest {
client: Client,
base_url: Url,
auth: AuthMode,
chain_id: u64,
order_id: String,
}
impl CancelOrderRequest {
pub async fn send(self) -> Result<CancelResponse> {
#[derive(serde::Serialize)]
struct CancelRequest {
#[serde(rename = "orderID")]
order_id: String,
}
let request = CancelRequest {
order_id: self.order_id,
};
Request::delete(
self.client,
self.base_url,
"/order",
self.auth,
self.chain_id,
)
.body(&request)?
.send()
.await
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct OpenOrder {
pub id: String,
pub market: String,
pub asset_id: String,
#[serde(flatten)]
pub order: SignedOrder,
pub status: String,
pub created_at: String,
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct OrderResponse {
pub success: bool,
pub error_msg: Option<String>,
pub order_id: Option<String>,
#[serde(default)]
pub transaction_hashes: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all(deserialize = "camelCase"))]
pub struct CancelResponse {
pub success: bool,
pub error_msg: Option<String>,
}