bpx_api_client/routes/
rfq.rs

1use bpx_api_types::rfq::{
2    Quote, QuoteAcceptPayload, QuotePayload, RequestForQuote, RequestForQuoteCancelPayload,
3    RequestForQuotePayload, RequestForQuoteRefreshPayload,
4};
5
6#[cfg(feature = "ws")]
7use bpx_api_types::rfq::RequestForQuoteUpdate;
8#[cfg(feature = "ws")]
9use tokio::sync::mpsc::Sender;
10
11use crate::BpxClient;
12use crate::error::Result;
13
14#[doc(hidden)]
15pub const API_RFQ: &str = "/api/v1/rfq";
16#[doc(hidden)]
17pub const API_RFQ_QUOTE: &str = "/api/v1/rfq/quote";
18#[doc(hidden)]
19pub const API_RFQ_CANCEL: &str = "/api/v1/rfq/cancel";
20#[doc(hidden)]
21pub const API_RFQ_REFRESH: &str = "/api/v1/rfq/refresh";
22#[doc(hidden)]
23pub const API_RFQ_ACCEPT: &str = "/api/v1/rfq/accept";
24
25#[cfg(feature = "ws")]
26const API_RFQ_STREAM: &str = "account.rfqUpdate";
27
28impl BpxClient {
29    pub async fn submit_rfq(&self, payload: RequestForQuotePayload) -> Result<RequestForQuote> {
30        let endpoint = self.base_url.join(API_RFQ)?;
31        let res = self.post(endpoint, payload).await?;
32        res.json().await.map_err(Into::into)
33    }
34
35    pub async fn cancel_rfq(
36        &self,
37        payload: RequestForQuoteCancelPayload,
38    ) -> Result<RequestForQuote> {
39        let endpoint = self.base_url.join(API_RFQ_CANCEL)?;
40        let res = self.post(endpoint, payload).await?;
41        res.json().await.map_err(Into::into)
42    }
43
44    pub async fn refresh_rfq(
45        &self,
46        payload: RequestForQuoteRefreshPayload,
47    ) -> Result<RequestForQuote> {
48        let endpoint = self.base_url.join(API_RFQ_REFRESH)?;
49        let res = self.post(endpoint, payload).await?;
50        res.json().await.map_err(Into::into)
51    }
52
53    pub async fn accept_quote(&self, payload: QuoteAcceptPayload) -> Result<RequestForQuote> {
54        let endpoint = self.base_url.join(API_RFQ_ACCEPT)?;
55        let res = self.post(endpoint, payload).await?;
56        res.json().await.map_err(Into::into)
57    }
58
59    pub async fn submit_quote(&self, payload: QuotePayload) -> Result<Quote> {
60        let endpoint = self.base_url.join(API_RFQ_QUOTE)?;
61        let res = self.post(endpoint, payload).await?;
62        res.json().await.map_err(Into::into)
63    }
64
65    #[cfg(feature = "ws")]
66    pub async fn subscribe_to_rfqs(&self, tx: Sender<RequestForQuoteUpdate>) -> Result<()> {
67        self.subscribe(API_RFQ_STREAM, tx).await
68    }
69}