derive-rs 0.1.11

Rust SDK for Derive.xyz
use crate::{
    actions::{
        ActionData, ExecuteQuoteArgs, ModuleType, RfqExecuteData, SendQuoteArgs,
        TransferPositionsData,
    },
    models::{
        CancelBatchRfqsRequest, CancelBatchRfqsResponse, Direction, Instrument, PollRfqsRequest,
        Quote, QuoteExecuteResponse, Rfq, RfqGetBestQuoteRequest, RfqGetBestQuoteResponse,
        RfqPollResponse, SendRfqRequest,
    },
    types::ClientError,
    ws_client::WsClient,
};
pub struct RfqsNamespace<'a> {
    pub ws_client: &'a WsClient,
}
impl<'a> RfqsNamespace<'a> {
    pub async fn send_rfq(&self, request: SendRfqRequest) -> Result<Rfq, ClientError> {
        self.ws_client.rpc().rfq().send_rfq(request).await
    }

    pub async fn poll_rfqs(
        &self,
        request: PollRfqsRequest,
    ) -> Result<RfqPollResponse, ClientError> {
        self.ws_client.rpc().rfq().poll_rfqs(request).await
    }

    pub async fn send_quote(&self, request: SendQuoteArgs) -> Result<Quote, ClientError> {
        let instrument_map = self
            .ws_client
            .instruments_cache
            .iter()
            .map(|entry| {
                let instrument = entry.value();
                (instrument.instrument_name.clone(), instrument.clone())
            })
            .collect::<std::collections::HashMap<String, Instrument>>();

        let rfq_data = TransferPositionsData::from_send_quote_args(
            request.clone(),
            Direction::Sell,
            1,
            &instrument_map,
        )?;
        let action_data = ActionData::new(
            rfq_data,
            self.ws_client.subaccount_id.unwrap(),
            self.ws_client.wallet.clone().unwrap().address(),
            &self
                .ws_client
                .derive_wallet
                .clone()
                .unwrap()
                .parse()
                .expect("Couldnt unwrap."),
            &self.ws_client.environment,
            ModuleType::RfqPositionTransfer,
        )?;

        let params = action_data.populate_send_quote(
            &self.ws_client.wallet.clone().unwrap(),
            request.clone(),
            &self.ws_client.environment,
            self.ws_client.subaccount_id.unwrap(),
        )?;

        self.ws_client.rpc().rfq().send_quote(params).await
    }

    pub async fn execute_best_quote(
        &self,
        request: ExecuteQuoteArgs,
    ) -> Result<QuoteExecuteResponse, ClientError> {
        let instrument_map = self
            .ws_client
            .instruments_cache
            .iter()
            .map(|entry| {
                let instrument = entry.value();
                (instrument.instrument_name.clone(), instrument.clone())
            })
            .collect::<std::collections::HashMap<String, Instrument>>();

        let rfq_data = RfqExecuteData::from_execute_quote_args(
            request.clone(),
            &instrument_map,
            Direction::Buy,
            -1,
        )?;
        let action_data = ActionData::new(
            rfq_data.clone(),
            self.ws_client.subaccount_id.unwrap(),
            self.ws_client.wallet.clone().unwrap().address(),
            &self
                .ws_client
                .derive_wallet
                .clone()
                .unwrap()
                .parse()
                .expect("Couldnt unwrap."),
            &self.ws_client.environment,
            ModuleType::RfqPositionTransfer,
        )?;

        let params = action_data.populate_execute_quote(
            &self.ws_client.wallet.clone().unwrap(),
            request.clone(),
            &self.ws_client.environment,
            self.ws_client.subaccount_id.unwrap(),
        )?;

        self.ws_client.rpc().rfq().execute_quote(params).await
    }

    pub async fn cancel_batch_rfqs(
        &self,
        request: CancelBatchRfqsRequest,
    ) -> Result<CancelBatchRfqsResponse, ClientError> {
        self.ws_client.rpc().rfq().cancel_batch_rfqs(request).await
    }

    pub async fn get_best_quote(
        &self,
        request: RfqGetBestQuoteRequest,
    ) -> Result<RfqGetBestQuoteResponse, ClientError> {
        self.ws_client.rpc().rfq().rfq_get_best_quote(request).await
    }
}