use http::Method;
use serde::Deserialize;
use tracing::instrument;
use crate::dealing::common::DealConfirmation;
use crate::dealing::working_orders::create_working_order::{
CreateWorkingOrderBuilder, Missing, fetch_confirmation,
};
use crate::dealing::working_orders::models::{
UpdateWorkingOrderRequest, WorkingOrderEntryV1Raw, WorkingOrderEntryV2Raw, WorkingOrderV1,
WorkingOrderV2,
};
use crate::error::Result;
use crate::models::common::DealId;
use super::WorkingOrdersApi;
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
struct ListEnvelopeV1 {
working_orders: Vec<WorkingOrderEntryV1Raw>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
struct ListEnvelopeV2 {
working_orders: Vec<WorkingOrderEntryV2Raw>,
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
struct DealReferenceResponse {
deal_reference: crate::models::common::DealReference,
}
impl WorkingOrdersApi<'_> {
#[instrument(skip_all, fields(version = 1))]
pub async fn list_v1(&self) -> Result<Vec<WorkingOrderV1>> {
let env: ListEnvelopeV1 = self
.client
.transport
.request(
Method::GET,
"workingorders",
Some(1),
None::<&()>,
&self.client.session,
)
.await?;
Ok(env
.working_orders
.into_iter()
.map(|e| WorkingOrderV1 {
order_data: e.working_order_data,
market: e.market_data,
})
.collect())
}
#[instrument(skip_all, fields(version = 2))]
pub async fn list_v2(&self) -> Result<Vec<WorkingOrderV2>> {
let env: ListEnvelopeV2 = self
.client
.transport
.request(
Method::GET,
"workingorders",
Some(2),
None::<&()>,
&self.client.session,
)
.await?;
Ok(env
.working_orders
.into_iter()
.map(|e| WorkingOrderV2 {
order_data: e.working_order_data,
market: e.market_data,
})
.collect())
}
pub async fn list(&self) -> Result<Vec<WorkingOrderV2>> {
self.list_v2().await
}
pub fn create(
&self,
) -> CreateWorkingOrderBuilder<
'_,
Missing,
Missing,
Missing,
Missing,
Missing,
Missing,
Missing,
Missing,
Missing,
> {
CreateWorkingOrderBuilder::new(self.client)
}
#[instrument(skip_all, fields(deal_id = %deal_id))]
pub async fn update(
&self,
deal_id: &DealId,
req: UpdateWorkingOrderRequest,
) -> Result<DealConfirmation> {
let path = format!("workingorders/otc/{}", deal_id.as_str());
let resp: DealReferenceResponse = self
.client
.transport
.request(
Method::PUT,
&path,
Some(2),
Some(&req),
&self.client.session,
)
.await?;
fetch_confirmation(self.client, &resp.deal_reference).await
}
#[instrument(skip_all, fields(deal_id = %deal_id))]
pub async fn delete(&self, deal_id: &DealId) -> Result<DealConfirmation> {
let path = format!("workingorders/otc/{}", deal_id.as_str());
let resp: DealReferenceResponse = self
.client
.transport
.request::<(), _>(
Method::DELETE,
&path,
Some(2),
None::<&()>,
&self.client.session,
)
.await?;
fetch_confirmation(self.client, &resp.deal_reference).await
}
}