upstox-rust-sdk 1.0.0

SDK to access Upstox's Uplink APIs programmatically
Documentation
use {
    crate::{
        client::ApiClient,
        constants::{
            APIVersion, BaseUrlType, EXPIRED_INSTRUMENTS_EXPIRED_FUTURE_CONTRACTS_ENDPOINT,
            EXPIRED_INSTRUMENTS_EXPIRED_HISTORICAL_CANDLE_DATA_ENDPOINT,
            EXPIRED_INSTRUMENTS_EXPIRED_OPTION_CONTRACTS_ENDPOINT,
            EXPIRED_INSTRUMENTS_EXPIRIES_ENDPOINT,
        },
        models::{
            error_response::ErrorResponse,
            expired_instruments::{
                expired_derivative_contracts_request::ExpiredDerivativeContractsRequest,
                expired_future_contracts_response::ExpiredFutureContractsResponse,
                expired_historical_candle_data_request::ExpiredHistoricalCandleDataRequest,
                expiries_request::ExpiriesRequest,
            },
            historical_data::candle_data_response::CandleDataResponse,
            option_chain::option_contracts_response::OptionContractsResponse,
            success_response::SuccessResponse,
        },
        rate_limiter::RateLimitExceeded,
        utils::ToKeyValueTuples,
    },
    serde_valid::Validate,
};

impl ApiClient {
    pub async fn get_expiries(
        &self,
        expiries_params: ExpiriesRequest,
    ) -> Result<Result<SuccessResponse<Vec<String>>, ErrorResponse>, RateLimitExceeded> {
        expiries_params.validate().unwrap();

        let res: reqwest::Response = self
            .get(
                EXPIRED_INSTRUMENTS_EXPIRIES_ENDPOINT,
                true,
                Some(&expiries_params.to_key_value_tuples_vec()),
                BaseUrlType::REGULAR,
                APIVersion::V2,
            )
            .await?;

        Ok(match res.status().as_u16() {
            200 => Ok(res.json::<SuccessResponse<Vec<String>>>().await.unwrap()),
            _ => Err(res.json::<ErrorResponse>().await.unwrap()),
        })
    }

    pub async fn get_expired_option_contracts(
        &self,
        expired_option_contracts_params: ExpiredDerivativeContractsRequest,
    ) -> Result<
        Result<SuccessResponse<Vec<OptionContractsResponse>>, ErrorResponse>,
        RateLimitExceeded,
    > {
        expired_option_contracts_params.validate().unwrap();

        let res: reqwest::Response = self
            .get(
                EXPIRED_INSTRUMENTS_EXPIRED_OPTION_CONTRACTS_ENDPOINT,
                true,
                Some(&expired_option_contracts_params.to_key_value_tuples_vec()),
                BaseUrlType::REGULAR,
                APIVersion::V2,
            )
            .await?;

        Ok(match res.status().as_u16() {
            200 => Ok(res
                .json::<SuccessResponse<Vec<OptionContractsResponse>>>()
                .await
                .unwrap()),
            _ => Err(res.json::<ErrorResponse>().await.unwrap()),
        })
    }

    pub async fn get_expired_future_contracts(
        &self,
        expired_future_contracts_params: ExpiredDerivativeContractsRequest,
    ) -> Result<
        Result<SuccessResponse<Vec<ExpiredFutureContractsResponse>>, ErrorResponse>,
        RateLimitExceeded,
    > {
        expired_future_contracts_params.validate().unwrap();

        let res: reqwest::Response = self
            .get(
                EXPIRED_INSTRUMENTS_EXPIRED_FUTURE_CONTRACTS_ENDPOINT,
                true,
                Some(&expired_future_contracts_params.to_key_value_tuples_vec()),
                BaseUrlType::REGULAR,
                APIVersion::V2,
            )
            .await?;

        Ok(match res.status().as_u16() {
            200 => Ok(res
                .json::<SuccessResponse<Vec<ExpiredFutureContractsResponse>>>()
                .await
                .unwrap()),
            _ => Err(res.json::<ErrorResponse>().await.unwrap()),
        })
    }

    pub async fn get_expired_historical_candle_data(
        &self,
        expired_historical_candles_path_params: ExpiredHistoricalCandleDataRequest,
    ) -> Result<Result<SuccessResponse<CandleDataResponse>, ErrorResponse>, RateLimitExceeded> {
        expired_historical_candles_path_params.validate().unwrap();

        let res: reqwest::Response = self
            .get(
                format!(
                    "{}/{}/{}/{}/{}",
                    EXPIRED_INSTRUMENTS_EXPIRED_HISTORICAL_CANDLE_DATA_ENDPOINT,
                    expired_historical_candles_path_params.expired_instrument_key,
                    expired_historical_candles_path_params.interval,
                    expired_historical_candles_path_params.to_date,
                    expired_historical_candles_path_params.from_date
                )
                .as_str(),
                true,
                None,
                BaseUrlType::REGULAR,
                APIVersion::V2,
            )
            .await?;

        Ok(match res.status().as_u16() {
            200 => Ok(res
                .json::<SuccessResponse<CandleDataResponse>>()
                .await
                .unwrap()),
            _ => Err(res.json::<ErrorResponse>().await.unwrap()),
        })
    }
}