/*
* Simple Earn REST API
*
* Earn rewards by subscribing to flexible or locked Simple Earn products.
*
* The version of the OpenAPI document: 1.0.0
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
#![allow(unused_imports)]
use async_trait::async_trait;
use derive_builder::Builder;
use reqwest;
use rust_decimal::prelude::*;
use serde::{Deserialize, Serialize};
use serde_json::{Value, json};
use std::collections::BTreeMap;
use crate::common::{
config::ConfigurationRestApi,
models::{ParamBuildError, RestApiResponse},
utils::send_request,
};
use crate::simple_earn::rest_api::models;
const HAS_TIME_UNIT: bool = false;
#[async_trait]
pub trait FlexibleLockedApi: Send + Sync {
async fn get_collateral_record(
&self,
params: GetCollateralRecordParams,
) -> anyhow::Result<RestApiResponse<models::GetCollateralRecordResponse>>;
async fn get_flexible_personal_left_quota(
&self,
params: GetFlexiblePersonalLeftQuotaParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexiblePersonalLeftQuotaResponse>>;
async fn get_flexible_product_position(
&self,
params: GetFlexibleProductPositionParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexibleProductPositionResponse>>;
async fn get_flexible_redemption_record(
&self,
params: GetFlexibleRedemptionRecordParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexibleRedemptionRecordResponse>>;
async fn get_flexible_rewards_history(
&self,
params: GetFlexibleRewardsHistoryParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexibleRewardsHistoryResponse>>;
async fn get_flexible_subscription_preview(
&self,
params: GetFlexibleSubscriptionPreviewParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexibleSubscriptionPreviewResponse>>;
async fn get_flexible_subscription_record(
&self,
params: GetFlexibleSubscriptionRecordParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexibleSubscriptionRecordResponse>>;
async fn get_locked_personal_left_quota(
&self,
params: GetLockedPersonalLeftQuotaParams,
) -> anyhow::Result<RestApiResponse<models::GetLockedPersonalLeftQuotaResponse>>;
async fn get_locked_product_position(
&self,
params: GetLockedProductPositionParams,
) -> anyhow::Result<RestApiResponse<models::GetLockedProductPositionResponse>>;
async fn get_locked_redemption_record(
&self,
params: GetLockedRedemptionRecordParams,
) -> anyhow::Result<RestApiResponse<models::GetLockedRedemptionRecordResponse>>;
async fn get_locked_rewards_history(
&self,
params: GetLockedRewardsHistoryParams,
) -> anyhow::Result<RestApiResponse<models::GetLockedRewardsHistoryResponse>>;
async fn get_locked_subscription_preview(
&self,
params: GetLockedSubscriptionPreviewParams,
) -> anyhow::Result<RestApiResponse<Vec<models::GetLockedSubscriptionPreviewResponseInner>>>;
async fn get_locked_subscription_record(
&self,
params: GetLockedSubscriptionRecordParams,
) -> anyhow::Result<RestApiResponse<models::GetLockedSubscriptionRecordResponse>>;
async fn get_rate_history(
&self,
params: GetRateHistoryParams,
) -> anyhow::Result<RestApiResponse<models::GetRateHistoryResponse>>;
async fn get_simple_earn_flexible_product_list(
&self,
params: GetSimpleEarnFlexibleProductListParams,
) -> anyhow::Result<RestApiResponse<models::GetSimpleEarnFlexibleProductListResponse>>;
async fn get_simple_earn_locked_product_list(
&self,
params: GetSimpleEarnLockedProductListParams,
) -> anyhow::Result<RestApiResponse<models::GetSimpleEarnLockedProductListResponse>>;
async fn redeem_flexible_product(
&self,
params: RedeemFlexibleProductParams,
) -> anyhow::Result<RestApiResponse<models::RedeemFlexibleProductResponse>>;
async fn redeem_locked_product(
&self,
params: RedeemLockedProductParams,
) -> anyhow::Result<RestApiResponse<models::RedeemLockedProductResponse>>;
async fn set_flexible_auto_subscribe(
&self,
params: SetFlexibleAutoSubscribeParams,
) -> anyhow::Result<RestApiResponse<models::SetFlexibleAutoSubscribeResponse>>;
async fn set_locked_auto_subscribe(
&self,
params: SetLockedAutoSubscribeParams,
) -> anyhow::Result<RestApiResponse<models::SetLockedAutoSubscribeResponse>>;
async fn set_locked_product_redeem_option(
&self,
params: SetLockedProductRedeemOptionParams,
) -> anyhow::Result<RestApiResponse<models::SetLockedProductRedeemOptionResponse>>;
async fn simple_account(
&self,
params: SimpleAccountParams,
) -> anyhow::Result<RestApiResponse<models::SimpleAccountResponse>>;
async fn subscribe_flexible_product(
&self,
params: SubscribeFlexibleProductParams,
) -> anyhow::Result<RestApiResponse<models::SubscribeFlexibleProductResponse>>;
async fn subscribe_locked_product(
&self,
params: SubscribeLockedProductParams,
) -> anyhow::Result<RestApiResponse<models::SubscribeLockedProductResponse>>;
}
#[derive(Debug, Clone)]
pub struct FlexibleLockedApiClient {
configuration: ConfigurationRestApi,
}
impl FlexibleLockedApiClient {
pub fn new(configuration: ConfigurationRestApi) -> Self {
Self { configuration }
}
}
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum GetFlexibleRewardsHistoryTypeEnum {
#[serde(rename = "BONUS")]
Bonus,
#[serde(rename = "REALTIME")]
Realtime,
#[serde(rename = "REWARDS")]
Rewards,
#[serde(rename = "ALL")]
All,
}
impl GetFlexibleRewardsHistoryTypeEnum {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
Self::Bonus => "BONUS",
Self::Realtime => "REALTIME",
Self::Rewards => "REWARDS",
Self::All => "ALL",
}
}
}
impl std::str::FromStr for GetFlexibleRewardsHistoryTypeEnum {
type Err = Box<dyn std::error::Error + Send + Sync>;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"BONUS" => Ok(Self::Bonus),
"REALTIME" => Ok(Self::Realtime),
"REWARDS" => Ok(Self::Rewards),
"ALL" => Ok(Self::All),
other => Err(format!("invalid GetFlexibleRewardsHistoryTypeEnum: {}", other).into()),
}
}
}
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum GetRateHistoryAprPeriodEnum {
#[serde(rename = "DAY")]
Day,
#[serde(rename = "YEAR")]
Year,
}
impl GetRateHistoryAprPeriodEnum {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
Self::Day => "DAY",
Self::Year => "YEAR",
}
}
}
impl std::str::FromStr for GetRateHistoryAprPeriodEnum {
type Err = Box<dyn std::error::Error + Send + Sync>;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"DAY" => Ok(Self::Day),
"YEAR" => Ok(Self::Year),
other => Err(format!("invalid GetRateHistoryAprPeriodEnum: {}", other).into()),
}
}
}
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum RedeemFlexibleProductDestAccountEnum {
#[serde(rename = "SPOT")]
Spot,
#[serde(rename = "FUND")]
Fund,
}
impl RedeemFlexibleProductDestAccountEnum {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
Self::Spot => "SPOT",
Self::Fund => "FUND",
}
}
}
impl std::str::FromStr for RedeemFlexibleProductDestAccountEnum {
type Err = Box<dyn std::error::Error + Send + Sync>;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"SPOT" => Ok(Self::Spot),
"FUND" => Ok(Self::Fund),
other => Err(format!("invalid RedeemFlexibleProductDestAccountEnum: {}", other).into()),
}
}
}
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SetLockedProductRedeemOptionRedeemToEnum {
#[serde(rename = "SPOT")]
Spot,
#[serde(rename = "FLEXIBLE")]
Flexible,
}
impl SetLockedProductRedeemOptionRedeemToEnum {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
Self::Spot => "SPOT",
Self::Flexible => "FLEXIBLE",
}
}
}
impl std::str::FromStr for SetLockedProductRedeemOptionRedeemToEnum {
type Err = Box<dyn std::error::Error + Send + Sync>;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"SPOT" => Ok(Self::Spot),
"FLEXIBLE" => Ok(Self::Flexible),
other => Err(format!(
"invalid SetLockedProductRedeemOptionRedeemToEnum: {}",
other
)
.into()),
}
}
}
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SubscribeFlexibleProductSourceAccountEnum {
#[serde(rename = "SPOT")]
Spot,
#[serde(rename = "FUND")]
Fund,
#[serde(rename = "ALL")]
All,
}
impl SubscribeFlexibleProductSourceAccountEnum {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
Self::Spot => "SPOT",
Self::Fund => "FUND",
Self::All => "ALL",
}
}
}
impl std::str::FromStr for SubscribeFlexibleProductSourceAccountEnum {
type Err = Box<dyn std::error::Error + Send + Sync>;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"SPOT" => Ok(Self::Spot),
"FUND" => Ok(Self::Fund),
"ALL" => Ok(Self::All),
other => Err(format!(
"invalid SubscribeFlexibleProductSourceAccountEnum: {}",
other
)
.into()),
}
}
}
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SubscribeLockedProductSourceAccountEnum {
#[serde(rename = "SPOT")]
Spot,
#[serde(rename = "FUND")]
Fund,
#[serde(rename = "ALL")]
All,
}
impl SubscribeLockedProductSourceAccountEnum {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
Self::Spot => "SPOT",
Self::Fund => "FUND",
Self::All => "ALL",
}
}
}
impl std::str::FromStr for SubscribeLockedProductSourceAccountEnum {
type Err = Box<dyn std::error::Error + Send + Sync>;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"SPOT" => Ok(Self::Spot),
"FUND" => Ok(Self::Fund),
"ALL" => Ok(Self::All),
other => {
Err(format!("invalid SubscribeLockedProductSourceAccountEnum: {}", other).into())
}
}
}
}
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SubscribeLockedProductRedeemToEnum {
#[serde(rename = "SPOT")]
Spot,
#[serde(rename = "FLEXIBLE")]
Flexible,
}
impl SubscribeLockedProductRedeemToEnum {
#[must_use]
pub fn as_str(&self) -> &'static str {
match self {
Self::Spot => "SPOT",
Self::Flexible => "FLEXIBLE",
}
}
}
impl std::str::FromStr for SubscribeLockedProductRedeemToEnum {
type Err = Box<dyn std::error::Error + Send + Sync>;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"SPOT" => Ok(Self::Spot),
"FLEXIBLE" => Ok(Self::Flexible),
other => Err(format!("invalid SubscribeLockedProductRedeemToEnum: {}", other).into()),
}
}
}
/// Request parameters for the [`get_collateral_record`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`get_collateral_record`](#method.get_collateral_record).
#[derive(Clone, Debug, Builder, Deserialize, Default)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct GetCollateralRecordParams {
///
/// The `product_id` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "productId", default)]
pub product_id: Option<String>,
///
/// The `start_time` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "startTime", default)]
pub start_time: Option<i64>,
///
/// The `end_time` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "endTime", default)]
pub end_time: Option<i64>,
/// Currently querying page.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "current", default)]
pub current: Option<i64>,
/// Number of results per page.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "size", default)]
pub size: Option<i64>,
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl GetCollateralRecordParams {
/// Create a builder for [`get_collateral_record`].
///
#[must_use]
pub fn builder() -> GetCollateralRecordParamsBuilder {
GetCollateralRecordParamsBuilder::default()
}
}
/// Request parameters for the [`get_flexible_personal_left_quota`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`get_flexible_personal_left_quota`](#method.get_flexible_personal_left_quota).
#[derive(Clone, Debug, Builder, Deserialize)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct GetFlexiblePersonalLeftQuotaParams {
///
/// The `product_id` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "productId")]
pub product_id: String,
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl GetFlexiblePersonalLeftQuotaParams {
/// Create a builder for [`get_flexible_personal_left_quota`].
///
/// Required parameters:
///
/// * `product_id` — String
///
#[must_use]
pub fn builder(product_id: String) -> GetFlexiblePersonalLeftQuotaParamsBuilder {
GetFlexiblePersonalLeftQuotaParamsBuilder::default().product_id(product_id)
}
}
/// Request parameters for the [`get_flexible_product_position`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`get_flexible_product_position`](#method.get_flexible_product_position).
#[derive(Clone, Debug, Builder, Deserialize, Default)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct GetFlexibleProductPositionParams {
///
/// The `asset` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "asset", default)]
pub asset: Option<String>,
///
/// The `product_id` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "productId", default)]
pub product_id: Option<String>,
/// Currently querying page. Starts from 1.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "current", default)]
pub current: Option<i64>,
/// Number of results per page.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "size", default)]
pub size: Option<i64>,
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl GetFlexibleProductPositionParams {
/// Create a builder for [`get_flexible_product_position`].
///
#[must_use]
pub fn builder() -> GetFlexibleProductPositionParamsBuilder {
GetFlexibleProductPositionParamsBuilder::default()
}
}
/// Request parameters for the [`get_flexible_redemption_record`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`get_flexible_redemption_record`](#method.get_flexible_redemption_record).
#[derive(Clone, Debug, Builder, Deserialize, Default)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct GetFlexibleRedemptionRecordParams {
///
/// The `product_id` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "productId", default)]
pub product_id: Option<String>,
///
/// The `redeem_id` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "redeemId", default)]
pub redeem_id: Option<String>,
///
/// The `asset` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "asset", default)]
pub asset: Option<String>,
///
/// The `start_time` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "startTime", default)]
pub start_time: Option<i64>,
///
/// The `end_time` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "endTime", default)]
pub end_time: Option<i64>,
/// Currently querying page. Starts from 1.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "current", default)]
pub current: Option<i64>,
/// Number of results per page.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "size", default)]
pub size: Option<i64>,
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl GetFlexibleRedemptionRecordParams {
/// Create a builder for [`get_flexible_redemption_record`].
///
#[must_use]
pub fn builder() -> GetFlexibleRedemptionRecordParamsBuilder {
GetFlexibleRedemptionRecordParamsBuilder::default()
}
}
/// Request parameters for the [`get_flexible_rewards_history`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`get_flexible_rewards_history`](#method.get_flexible_rewards_history).
#[derive(Clone, Debug, Builder, Deserialize, Default)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct GetFlexibleRewardsHistoryParams {
///
/// The `product_id` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "productId", default)]
pub product_id: Option<String>,
///
/// The `asset` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "asset", default)]
pub asset: Option<String>,
///
/// The `start_time` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "startTime", default)]
pub start_time: Option<i64>,
///
/// The `end_time` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "endTime", default)]
pub end_time: Option<i64>,
/// `BONUS` - Bonus tiered APR, `REALTIME` - Real-time APR, `REWARDS` - Historical rewards, `ALL` - All types. Default: `ALL`
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "type", default)]
pub r#type: Option<GetFlexibleRewardsHistoryTypeEnum>,
/// Currently querying page. Starts from 1.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "current", default)]
pub current: Option<i64>,
/// Number of results per page.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "size", default)]
pub size: Option<i64>,
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl GetFlexibleRewardsHistoryParams {
/// Create a builder for [`get_flexible_rewards_history`].
///
#[must_use]
pub fn builder() -> GetFlexibleRewardsHistoryParamsBuilder {
GetFlexibleRewardsHistoryParamsBuilder::default()
}
}
/// Request parameters for the [`get_flexible_subscription_preview`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`get_flexible_subscription_preview`](#method.get_flexible_subscription_preview).
#[derive(Clone, Debug, Builder, Deserialize)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct GetFlexibleSubscriptionPreviewParams {
///
/// The `product_id` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "productId")]
pub product_id: String,
///
/// The `amount` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "amount")]
pub amount: rust_decimal::Decimal,
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl GetFlexibleSubscriptionPreviewParams {
/// Create a builder for [`get_flexible_subscription_preview`].
///
/// Required parameters:
///
/// * `product_id` — String
/// * `amount` — `rust_decimal::Decimal`
///
#[must_use]
pub fn builder(
product_id: String,
amount: rust_decimal::Decimal,
) -> GetFlexibleSubscriptionPreviewParamsBuilder {
GetFlexibleSubscriptionPreviewParamsBuilder::default()
.product_id(product_id)
.amount(amount)
}
}
/// Request parameters for the [`get_flexible_subscription_record`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`get_flexible_subscription_record`](#method.get_flexible_subscription_record).
#[derive(Clone, Debug, Builder, Deserialize, Default)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct GetFlexibleSubscriptionRecordParams {
///
/// The `product_id` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "productId", default)]
pub product_id: Option<String>,
///
/// The `purchase_id` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "purchaseId", default)]
pub purchase_id: Option<String>,
///
/// The `asset` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "asset", default)]
pub asset: Option<String>,
///
/// The `start_time` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "startTime", default)]
pub start_time: Option<i64>,
///
/// The `end_time` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "endTime", default)]
pub end_time: Option<i64>,
/// Currently querying page. Starts from 1.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "current", default)]
pub current: Option<i64>,
/// Number of results per page.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "size", default)]
pub size: Option<i64>,
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl GetFlexibleSubscriptionRecordParams {
/// Create a builder for [`get_flexible_subscription_record`].
///
#[must_use]
pub fn builder() -> GetFlexibleSubscriptionRecordParamsBuilder {
GetFlexibleSubscriptionRecordParamsBuilder::default()
}
}
/// Request parameters for the [`get_locked_personal_left_quota`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`get_locked_personal_left_quota`](#method.get_locked_personal_left_quota).
#[derive(Clone, Debug, Builder, Deserialize)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct GetLockedPersonalLeftQuotaParams {
///
/// The `project_id` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "projectId")]
pub project_id: String,
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl GetLockedPersonalLeftQuotaParams {
/// Create a builder for [`get_locked_personal_left_quota`].
///
/// Required parameters:
///
/// * `project_id` — String
///
#[must_use]
pub fn builder(project_id: String) -> GetLockedPersonalLeftQuotaParamsBuilder {
GetLockedPersonalLeftQuotaParamsBuilder::default().project_id(project_id)
}
}
/// Request parameters for the [`get_locked_product_position`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`get_locked_product_position`](#method.get_locked_product_position).
#[derive(Clone, Debug, Builder, Deserialize, Default)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct GetLockedProductPositionParams {
///
/// The `asset` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "asset", default)]
pub asset: Option<String>,
///
/// The `position_id` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "positionId", default)]
pub position_id: Option<String>,
///
/// The `project_id` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "projectId", default)]
pub project_id: Option<String>,
/// Currently querying page. Starts from 1.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "current", default)]
pub current: Option<i64>,
/// Number of results per page.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "size", default)]
pub size: Option<i64>,
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl GetLockedProductPositionParams {
/// Create a builder for [`get_locked_product_position`].
///
#[must_use]
pub fn builder() -> GetLockedProductPositionParamsBuilder {
GetLockedProductPositionParamsBuilder::default()
}
}
/// Request parameters for the [`get_locked_redemption_record`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`get_locked_redemption_record`](#method.get_locked_redemption_record).
#[derive(Clone, Debug, Builder, Deserialize, Default)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct GetLockedRedemptionRecordParams {
///
/// The `position_id` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "positionId", default)]
pub position_id: Option<String>,
///
/// The `redeem_id` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "redeemId", default)]
pub redeem_id: Option<String>,
///
/// The `asset` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "asset", default)]
pub asset: Option<String>,
///
/// The `start_time` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "startTime", default)]
pub start_time: Option<i64>,
///
/// The `end_time` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "endTime", default)]
pub end_time: Option<i64>,
/// Currently querying page. Starts from 1.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "current", default)]
pub current: Option<i64>,
/// Number of results per page.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "size", default)]
pub size: Option<i64>,
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl GetLockedRedemptionRecordParams {
/// Create a builder for [`get_locked_redemption_record`].
///
#[must_use]
pub fn builder() -> GetLockedRedemptionRecordParamsBuilder {
GetLockedRedemptionRecordParamsBuilder::default()
}
}
/// Request parameters for the [`get_locked_rewards_history`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`get_locked_rewards_history`](#method.get_locked_rewards_history).
#[derive(Clone, Debug, Builder, Deserialize, Default)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct GetLockedRewardsHistoryParams {
///
/// The `position_id` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "positionId", default)]
pub position_id: Option<String>,
///
/// The `asset` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "asset", default)]
pub asset: Option<String>,
///
/// The `start_time` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "startTime", default)]
pub start_time: Option<i64>,
///
/// The `end_time` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "endTime", default)]
pub end_time: Option<i64>,
/// Currently querying page. Starts from 1.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "current", default)]
pub current: Option<i64>,
/// Number of results per page.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "size", default)]
pub size: Option<i64>,
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl GetLockedRewardsHistoryParams {
/// Create a builder for [`get_locked_rewards_history`].
///
#[must_use]
pub fn builder() -> GetLockedRewardsHistoryParamsBuilder {
GetLockedRewardsHistoryParamsBuilder::default()
}
}
/// Request parameters for the [`get_locked_subscription_preview`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`get_locked_subscription_preview`](#method.get_locked_subscription_preview).
#[derive(Clone, Debug, Builder, Deserialize)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct GetLockedSubscriptionPreviewParams {
///
/// The `project_id` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "projectId")]
pub project_id: String,
///
/// The `amount` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "amount")]
pub amount: rust_decimal::Decimal,
/// default true.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "autoSubscribe", default)]
pub auto_subscribe: Option<bool>,
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl GetLockedSubscriptionPreviewParams {
/// Create a builder for [`get_locked_subscription_preview`].
///
/// Required parameters:
///
/// * `project_id` — String
/// * `amount` — `rust_decimal::Decimal`
///
#[must_use]
pub fn builder(
project_id: String,
amount: rust_decimal::Decimal,
) -> GetLockedSubscriptionPreviewParamsBuilder {
GetLockedSubscriptionPreviewParamsBuilder::default()
.project_id(project_id)
.amount(amount)
}
}
/// Request parameters for the [`get_locked_subscription_record`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`get_locked_subscription_record`](#method.get_locked_subscription_record).
#[derive(Clone, Debug, Builder, Deserialize, Default)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct GetLockedSubscriptionRecordParams {
///
/// The `purchase_id` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "purchaseId", default)]
pub purchase_id: Option<String>,
///
/// The `asset` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "asset", default)]
pub asset: Option<String>,
///
/// The `start_time` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "startTime", default)]
pub start_time: Option<i64>,
///
/// The `end_time` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "endTime", default)]
pub end_time: Option<i64>,
/// Currently querying page. Starts from 1.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "current", default)]
pub current: Option<i64>,
/// Number of results per page.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "size", default)]
pub size: Option<i64>,
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl GetLockedSubscriptionRecordParams {
/// Create a builder for [`get_locked_subscription_record`].
///
#[must_use]
pub fn builder() -> GetLockedSubscriptionRecordParamsBuilder {
GetLockedSubscriptionRecordParamsBuilder::default()
}
}
/// Request parameters for the [`get_rate_history`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`get_rate_history`](#method.get_rate_history).
#[derive(Clone, Debug, Builder, Deserialize)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct GetRateHistoryParams {
///
/// The `product_id` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "productId")]
pub product_id: String,
///
/// The `apr_period` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "aprPeriod", default)]
pub apr_period: Option<GetRateHistoryAprPeriodEnum>,
///
/// The `start_time` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "startTime", default)]
pub start_time: Option<i64>,
///
/// The `end_time` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "endTime", default)]
pub end_time: Option<i64>,
/// Currently querying page
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "current", default)]
pub current: Option<i64>,
/// Number of results per page
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "size", default)]
pub size: Option<i64>,
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl GetRateHistoryParams {
/// Create a builder for [`get_rate_history`].
///
/// Required parameters:
///
/// * `product_id` — String
///
#[must_use]
pub fn builder(product_id: String) -> GetRateHistoryParamsBuilder {
GetRateHistoryParamsBuilder::default().product_id(product_id)
}
}
/// Request parameters for the [`get_simple_earn_flexible_product_list`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`get_simple_earn_flexible_product_list`](#method.get_simple_earn_flexible_product_list).
#[derive(Clone, Debug, Builder, Deserialize, Default)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct GetSimpleEarnFlexibleProductListParams {
///
/// The `asset` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "asset", default)]
pub asset: Option<String>,
/// Currently querying page. Starts from 1.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "current", default)]
pub current: Option<i64>,
/// Number of results per page.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "size", default)]
pub size: Option<i64>,
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl GetSimpleEarnFlexibleProductListParams {
/// Create a builder for [`get_simple_earn_flexible_product_list`].
///
#[must_use]
pub fn builder() -> GetSimpleEarnFlexibleProductListParamsBuilder {
GetSimpleEarnFlexibleProductListParamsBuilder::default()
}
}
/// Request parameters for the [`get_simple_earn_locked_product_list`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`get_simple_earn_locked_product_list`](#method.get_simple_earn_locked_product_list).
#[derive(Clone, Debug, Builder, Deserialize, Default)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct GetSimpleEarnLockedProductListParams {
///
/// The `asset` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "asset", default)]
pub asset: Option<String>,
/// Currently querying page. Starts from 1.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "current", default)]
pub current: Option<i64>,
/// Number of results per page.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "size", default)]
pub size: Option<i64>,
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl GetSimpleEarnLockedProductListParams {
/// Create a builder for [`get_simple_earn_locked_product_list`].
///
#[must_use]
pub fn builder() -> GetSimpleEarnLockedProductListParamsBuilder {
GetSimpleEarnLockedProductListParamsBuilder::default()
}
}
/// Request parameters for the [`redeem_flexible_product`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`redeem_flexible_product`](#method.redeem_flexible_product).
#[derive(Clone, Debug, Builder, Deserialize)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct RedeemFlexibleProductParams {
///
/// The `product_id` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "productId")]
pub product_id: String,
///
/// The `redeem_all` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "redeemAll", default)]
pub redeem_all: Option<bool>,
/// if redeemAll is false, amount is mandatory
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "amount", default)]
pub amount: Option<rust_decimal::Decimal>,
///
/// The `dest_account` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "destAccount", default)]
pub dest_account: Option<RedeemFlexibleProductDestAccountEnum>,
/// Request validity window in milliseconds.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl RedeemFlexibleProductParams {
/// Create a builder for [`redeem_flexible_product`].
///
/// Required parameters:
///
/// * `product_id` — String
///
#[must_use]
pub fn builder(product_id: String) -> RedeemFlexibleProductParamsBuilder {
RedeemFlexibleProductParamsBuilder::default().product_id(product_id)
}
}
/// Request parameters for the [`redeem_locked_product`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`redeem_locked_product`](#method.redeem_locked_product).
#[derive(Clone, Debug, Builder, Deserialize)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct RedeemLockedProductParams {
/// Locked product position ID
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "positionId")]
pub position_id: String,
/// Request validity window in milliseconds.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl RedeemLockedProductParams {
/// Create a builder for [`redeem_locked_product`].
///
/// Required parameters:
///
/// * `position_id` — Locked product position ID
///
#[must_use]
pub fn builder(position_id: String) -> RedeemLockedProductParamsBuilder {
RedeemLockedProductParamsBuilder::default().position_id(position_id)
}
}
/// Request parameters for the [`set_flexible_auto_subscribe`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`set_flexible_auto_subscribe`](#method.set_flexible_auto_subscribe).
#[derive(Clone, Debug, Builder, Deserialize)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct SetFlexibleAutoSubscribeParams {
///
/// The `product_id` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "productId")]
pub product_id: String,
///
/// The `auto_subscribe` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "autoSubscribe")]
pub auto_subscribe: bool,
/// Request validity window in milliseconds.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl SetFlexibleAutoSubscribeParams {
/// Create a builder for [`set_flexible_auto_subscribe`].
///
/// Required parameters:
///
/// * `product_id` — String
/// * `auto_subscribe` — bool
///
#[must_use]
pub fn builder(
product_id: String,
auto_subscribe: bool,
) -> SetFlexibleAutoSubscribeParamsBuilder {
SetFlexibleAutoSubscribeParamsBuilder::default()
.product_id(product_id)
.auto_subscribe(auto_subscribe)
}
}
/// Request parameters for the [`set_locked_auto_subscribe`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`set_locked_auto_subscribe`](#method.set_locked_auto_subscribe).
#[derive(Clone, Debug, Builder, Deserialize)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct SetLockedAutoSubscribeParams {
///
/// The `position_id` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "positionId")]
pub position_id: String,
///
/// The `auto_subscribe` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "autoSubscribe")]
pub auto_subscribe: bool,
/// Request validity window in milliseconds.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl SetLockedAutoSubscribeParams {
/// Create a builder for [`set_locked_auto_subscribe`].
///
/// Required parameters:
///
/// * `position_id` — String
/// * `auto_subscribe` — bool
///
#[must_use]
pub fn builder(
position_id: String,
auto_subscribe: bool,
) -> SetLockedAutoSubscribeParamsBuilder {
SetLockedAutoSubscribeParamsBuilder::default()
.position_id(position_id)
.auto_subscribe(auto_subscribe)
}
}
/// Request parameters for the [`set_locked_product_redeem_option`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`set_locked_product_redeem_option`](#method.set_locked_product_redeem_option).
#[derive(Clone, Debug, Builder, Deserialize)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct SetLockedProductRedeemOptionParams {
///
/// The `position_id` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "positionId")]
pub position_id: String,
///
/// The `redeem_to` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "redeemTo")]
pub redeem_to: SetLockedProductRedeemOptionRedeemToEnum,
/// Request validity window in milliseconds.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl SetLockedProductRedeemOptionParams {
/// Create a builder for [`set_locked_product_redeem_option`].
///
/// Required parameters:
///
/// * `position_id` — String
/// * `redeem_to` — String
///
#[must_use]
pub fn builder(
position_id: String,
redeem_to: SetLockedProductRedeemOptionRedeemToEnum,
) -> SetLockedProductRedeemOptionParamsBuilder {
SetLockedProductRedeemOptionParamsBuilder::default()
.position_id(position_id)
.redeem_to(redeem_to)
}
}
/// Request parameters for the [`simple_account`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`simple_account`](#method.simple_account).
#[derive(Clone, Debug, Builder, Deserialize, Default)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct SimpleAccountParams {
/// The value cannot be greater than 60000 (ms)
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl SimpleAccountParams {
/// Create a builder for [`simple_account`].
///
#[must_use]
pub fn builder() -> SimpleAccountParamsBuilder {
SimpleAccountParamsBuilder::default()
}
}
/// Request parameters for the [`subscribe_flexible_product`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`subscribe_flexible_product`](#method.subscribe_flexible_product).
#[derive(Clone, Debug, Builder, Deserialize)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct SubscribeFlexibleProductParams {
///
/// The `product_id` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "productId")]
pub product_id: String,
///
/// The `amount` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "amount")]
pub amount: rust_decimal::Decimal,
///
/// The `auto_subscribe` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "autoSubscribe", default)]
pub auto_subscribe: Option<bool>,
///
/// The `source_account` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "sourceAccount", default)]
pub source_account: Option<SubscribeFlexibleProductSourceAccountEnum>,
/// Request validity window in milliseconds.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl SubscribeFlexibleProductParams {
/// Create a builder for [`subscribe_flexible_product`].
///
/// Required parameters:
///
/// * `product_id` — String
/// * `amount` — `rust_decimal::Decimal`
///
#[must_use]
pub fn builder(
product_id: String,
amount: rust_decimal::Decimal,
) -> SubscribeFlexibleProductParamsBuilder {
SubscribeFlexibleProductParamsBuilder::default()
.product_id(product_id)
.amount(amount)
}
}
/// Request parameters for the [`subscribe_locked_product`] operation.
///
/// This struct holds all of the inputs you can pass when calling
/// [`subscribe_locked_product`](#method.subscribe_locked_product).
#[derive(Clone, Debug, Builder, Deserialize)]
#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
pub struct SubscribeLockedProductParams {
///
/// The `project_id` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "projectId")]
pub project_id: String,
///
/// The `amount` parameter.
///
/// This field is **required.
#[builder(setter(into))]
#[serde(rename = "amount")]
pub amount: rust_decimal::Decimal,
///
/// The `auto_subscribe` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "autoSubscribe", default)]
pub auto_subscribe: Option<bool>,
///
/// The `source_account` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "sourceAccount", default)]
pub source_account: Option<SubscribeLockedProductSourceAccountEnum>,
///
/// The `redeem_to` parameter.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "redeemTo", default)]
pub redeem_to: Option<SubscribeLockedProductRedeemToEnum>,
/// Request validity window in milliseconds.
///
/// This field is **optional.
#[builder(setter(into), default)]
#[serde(rename = "recvWindow", default)]
pub recv_window: Option<i64>,
}
impl SubscribeLockedProductParams {
/// Create a builder for [`subscribe_locked_product`].
///
/// Required parameters:
///
/// * `project_id` — String
/// * `amount` — `rust_decimal::Decimal`
///
#[must_use]
pub fn builder(
project_id: String,
amount: rust_decimal::Decimal,
) -> SubscribeLockedProductParamsBuilder {
SubscribeLockedProductParamsBuilder::default()
.project_id(project_id)
.amount(amount)
}
}
#[async_trait]
impl FlexibleLockedApi for FlexibleLockedApiClient {
async fn get_collateral_record(
&self,
params: GetCollateralRecordParams,
) -> anyhow::Result<RestApiResponse<models::GetCollateralRecordResponse>> {
let GetCollateralRecordParams {
product_id,
start_time,
end_time,
current,
size,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
if let Some(rw) = product_id {
query_params.insert("productId".to_string(), json!(rw));
}
if let Some(rw) = start_time {
query_params.insert("startTime".to_string(), json!(rw));
}
if let Some(rw) = end_time {
query_params.insert("endTime".to_string(), json!(rw));
}
if let Some(rw) = current {
query_params.insert("current".to_string(), json!(rw));
}
if let Some(rw) = size {
query_params.insert("size".to_string(), json!(rw));
}
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::GetCollateralRecordResponse>(
&self.configuration,
"/sapi/v1/simple-earn/flexible/history/collateralRecord",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn get_flexible_personal_left_quota(
&self,
params: GetFlexiblePersonalLeftQuotaParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexiblePersonalLeftQuotaResponse>> {
let GetFlexiblePersonalLeftQuotaParams {
product_id,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
query_params.insert("productId".to_string(), json!(product_id));
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::GetFlexiblePersonalLeftQuotaResponse>(
&self.configuration,
"/sapi/v1/simple-earn/flexible/personalLeftQuota",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn get_flexible_product_position(
&self,
params: GetFlexibleProductPositionParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexibleProductPositionResponse>> {
let GetFlexibleProductPositionParams {
asset,
product_id,
current,
size,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
if let Some(rw) = asset {
query_params.insert("asset".to_string(), json!(rw));
}
if let Some(rw) = product_id {
query_params.insert("productId".to_string(), json!(rw));
}
if let Some(rw) = current {
query_params.insert("current".to_string(), json!(rw));
}
if let Some(rw) = size {
query_params.insert("size".to_string(), json!(rw));
}
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::GetFlexibleProductPositionResponse>(
&self.configuration,
"/sapi/v1/simple-earn/flexible/position",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn get_flexible_redemption_record(
&self,
params: GetFlexibleRedemptionRecordParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexibleRedemptionRecordResponse>> {
let GetFlexibleRedemptionRecordParams {
product_id,
redeem_id,
asset,
start_time,
end_time,
current,
size,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
if let Some(rw) = product_id {
query_params.insert("productId".to_string(), json!(rw));
}
if let Some(rw) = redeem_id {
query_params.insert("redeemId".to_string(), json!(rw));
}
if let Some(rw) = asset {
query_params.insert("asset".to_string(), json!(rw));
}
if let Some(rw) = start_time {
query_params.insert("startTime".to_string(), json!(rw));
}
if let Some(rw) = end_time {
query_params.insert("endTime".to_string(), json!(rw));
}
if let Some(rw) = current {
query_params.insert("current".to_string(), json!(rw));
}
if let Some(rw) = size {
query_params.insert("size".to_string(), json!(rw));
}
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::GetFlexibleRedemptionRecordResponse>(
&self.configuration,
"/sapi/v1/simple-earn/flexible/history/redemptionRecord",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn get_flexible_rewards_history(
&self,
params: GetFlexibleRewardsHistoryParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexibleRewardsHistoryResponse>> {
let GetFlexibleRewardsHistoryParams {
product_id,
asset,
start_time,
end_time,
r#type,
current,
size,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
if let Some(rw) = product_id {
query_params.insert("productId".to_string(), json!(rw));
}
if let Some(rw) = asset {
query_params.insert("asset".to_string(), json!(rw));
}
if let Some(rw) = start_time {
query_params.insert("startTime".to_string(), json!(rw));
}
if let Some(rw) = end_time {
query_params.insert("endTime".to_string(), json!(rw));
}
if let Some(rw) = r#type {
query_params.insert("type".to_string(), json!(rw));
}
if let Some(rw) = current {
query_params.insert("current".to_string(), json!(rw));
}
if let Some(rw) = size {
query_params.insert("size".to_string(), json!(rw));
}
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::GetFlexibleRewardsHistoryResponse>(
&self.configuration,
"/sapi/v1/simple-earn/flexible/history/rewardsRecord",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn get_flexible_subscription_preview(
&self,
params: GetFlexibleSubscriptionPreviewParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexibleSubscriptionPreviewResponse>> {
let GetFlexibleSubscriptionPreviewParams {
product_id,
amount,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
query_params.insert("productId".to_string(), json!(product_id));
query_params.insert("amount".to_string(), json!(amount));
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::GetFlexibleSubscriptionPreviewResponse>(
&self.configuration,
"/sapi/v1/simple-earn/flexible/subscriptionPreview",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn get_flexible_subscription_record(
&self,
params: GetFlexibleSubscriptionRecordParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexibleSubscriptionRecordResponse>> {
let GetFlexibleSubscriptionRecordParams {
product_id,
purchase_id,
asset,
start_time,
end_time,
current,
size,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
if let Some(rw) = product_id {
query_params.insert("productId".to_string(), json!(rw));
}
if let Some(rw) = purchase_id {
query_params.insert("purchaseId".to_string(), json!(rw));
}
if let Some(rw) = asset {
query_params.insert("asset".to_string(), json!(rw));
}
if let Some(rw) = start_time {
query_params.insert("startTime".to_string(), json!(rw));
}
if let Some(rw) = end_time {
query_params.insert("endTime".to_string(), json!(rw));
}
if let Some(rw) = current {
query_params.insert("current".to_string(), json!(rw));
}
if let Some(rw) = size {
query_params.insert("size".to_string(), json!(rw));
}
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::GetFlexibleSubscriptionRecordResponse>(
&self.configuration,
"/sapi/v1/simple-earn/flexible/history/subscriptionRecord",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn get_locked_personal_left_quota(
&self,
params: GetLockedPersonalLeftQuotaParams,
) -> anyhow::Result<RestApiResponse<models::GetLockedPersonalLeftQuotaResponse>> {
let GetLockedPersonalLeftQuotaParams {
project_id,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
query_params.insert("projectId".to_string(), json!(project_id));
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::GetLockedPersonalLeftQuotaResponse>(
&self.configuration,
"/sapi/v1/simple-earn/locked/personalLeftQuota",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn get_locked_product_position(
&self,
params: GetLockedProductPositionParams,
) -> anyhow::Result<RestApiResponse<models::GetLockedProductPositionResponse>> {
let GetLockedProductPositionParams {
asset,
position_id,
project_id,
current,
size,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
if let Some(rw) = asset {
query_params.insert("asset".to_string(), json!(rw));
}
if let Some(rw) = position_id {
query_params.insert("positionId".to_string(), json!(rw));
}
if let Some(rw) = project_id {
query_params.insert("projectId".to_string(), json!(rw));
}
if let Some(rw) = current {
query_params.insert("current".to_string(), json!(rw));
}
if let Some(rw) = size {
query_params.insert("size".to_string(), json!(rw));
}
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::GetLockedProductPositionResponse>(
&self.configuration,
"/sapi/v1/simple-earn/locked/position",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn get_locked_redemption_record(
&self,
params: GetLockedRedemptionRecordParams,
) -> anyhow::Result<RestApiResponse<models::GetLockedRedemptionRecordResponse>> {
let GetLockedRedemptionRecordParams {
position_id,
redeem_id,
asset,
start_time,
end_time,
current,
size,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
if let Some(rw) = position_id {
query_params.insert("positionId".to_string(), json!(rw));
}
if let Some(rw) = redeem_id {
query_params.insert("redeemId".to_string(), json!(rw));
}
if let Some(rw) = asset {
query_params.insert("asset".to_string(), json!(rw));
}
if let Some(rw) = start_time {
query_params.insert("startTime".to_string(), json!(rw));
}
if let Some(rw) = end_time {
query_params.insert("endTime".to_string(), json!(rw));
}
if let Some(rw) = current {
query_params.insert("current".to_string(), json!(rw));
}
if let Some(rw) = size {
query_params.insert("size".to_string(), json!(rw));
}
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::GetLockedRedemptionRecordResponse>(
&self.configuration,
"/sapi/v1/simple-earn/locked/history/redemptionRecord",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn get_locked_rewards_history(
&self,
params: GetLockedRewardsHistoryParams,
) -> anyhow::Result<RestApiResponse<models::GetLockedRewardsHistoryResponse>> {
let GetLockedRewardsHistoryParams {
position_id,
asset,
start_time,
end_time,
current,
size,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
if let Some(rw) = position_id {
query_params.insert("positionId".to_string(), json!(rw));
}
if let Some(rw) = asset {
query_params.insert("asset".to_string(), json!(rw));
}
if let Some(rw) = start_time {
query_params.insert("startTime".to_string(), json!(rw));
}
if let Some(rw) = end_time {
query_params.insert("endTime".to_string(), json!(rw));
}
if let Some(rw) = current {
query_params.insert("current".to_string(), json!(rw));
}
if let Some(rw) = size {
query_params.insert("size".to_string(), json!(rw));
}
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::GetLockedRewardsHistoryResponse>(
&self.configuration,
"/sapi/v1/simple-earn/locked/history/rewardsRecord",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn get_locked_subscription_preview(
&self,
params: GetLockedSubscriptionPreviewParams,
) -> anyhow::Result<RestApiResponse<Vec<models::GetLockedSubscriptionPreviewResponseInner>>>
{
let GetLockedSubscriptionPreviewParams {
project_id,
amount,
auto_subscribe,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
query_params.insert("projectId".to_string(), json!(project_id));
query_params.insert("amount".to_string(), json!(amount));
if let Some(rw) = auto_subscribe {
query_params.insert("autoSubscribe".to_string(), json!(rw));
}
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<Vec<models::GetLockedSubscriptionPreviewResponseInner>>(
&self.configuration,
"/sapi/v1/simple-earn/locked/subscriptionPreview",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn get_locked_subscription_record(
&self,
params: GetLockedSubscriptionRecordParams,
) -> anyhow::Result<RestApiResponse<models::GetLockedSubscriptionRecordResponse>> {
let GetLockedSubscriptionRecordParams {
purchase_id,
asset,
start_time,
end_time,
current,
size,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
if let Some(rw) = purchase_id {
query_params.insert("purchaseId".to_string(), json!(rw));
}
if let Some(rw) = asset {
query_params.insert("asset".to_string(), json!(rw));
}
if let Some(rw) = start_time {
query_params.insert("startTime".to_string(), json!(rw));
}
if let Some(rw) = end_time {
query_params.insert("endTime".to_string(), json!(rw));
}
if let Some(rw) = current {
query_params.insert("current".to_string(), json!(rw));
}
if let Some(rw) = size {
query_params.insert("size".to_string(), json!(rw));
}
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::GetLockedSubscriptionRecordResponse>(
&self.configuration,
"/sapi/v1/simple-earn/locked/history/subscriptionRecord",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn get_rate_history(
&self,
params: GetRateHistoryParams,
) -> anyhow::Result<RestApiResponse<models::GetRateHistoryResponse>> {
let GetRateHistoryParams {
product_id,
apr_period,
start_time,
end_time,
current,
size,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
query_params.insert("productId".to_string(), json!(product_id));
if let Some(rw) = apr_period {
query_params.insert("aprPeriod".to_string(), json!(rw));
}
if let Some(rw) = start_time {
query_params.insert("startTime".to_string(), json!(rw));
}
if let Some(rw) = end_time {
query_params.insert("endTime".to_string(), json!(rw));
}
if let Some(rw) = current {
query_params.insert("current".to_string(), json!(rw));
}
if let Some(rw) = size {
query_params.insert("size".to_string(), json!(rw));
}
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::GetRateHistoryResponse>(
&self.configuration,
"/sapi/v1/simple-earn/flexible/history/rateHistory",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn get_simple_earn_flexible_product_list(
&self,
params: GetSimpleEarnFlexibleProductListParams,
) -> anyhow::Result<RestApiResponse<models::GetSimpleEarnFlexibleProductListResponse>> {
let GetSimpleEarnFlexibleProductListParams {
asset,
current,
size,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
if let Some(rw) = asset {
query_params.insert("asset".to_string(), json!(rw));
}
if let Some(rw) = current {
query_params.insert("current".to_string(), json!(rw));
}
if let Some(rw) = size {
query_params.insert("size".to_string(), json!(rw));
}
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::GetSimpleEarnFlexibleProductListResponse>(
&self.configuration,
"/sapi/v1/simple-earn/flexible/list",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn get_simple_earn_locked_product_list(
&self,
params: GetSimpleEarnLockedProductListParams,
) -> anyhow::Result<RestApiResponse<models::GetSimpleEarnLockedProductListResponse>> {
let GetSimpleEarnLockedProductListParams {
asset,
current,
size,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
if let Some(rw) = asset {
query_params.insert("asset".to_string(), json!(rw));
}
if let Some(rw) = current {
query_params.insert("current".to_string(), json!(rw));
}
if let Some(rw) = size {
query_params.insert("size".to_string(), json!(rw));
}
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::GetSimpleEarnLockedProductListResponse>(
&self.configuration,
"/sapi/v1/simple-earn/locked/list",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn redeem_flexible_product(
&self,
params: RedeemFlexibleProductParams,
) -> anyhow::Result<RestApiResponse<models::RedeemFlexibleProductResponse>> {
let RedeemFlexibleProductParams {
product_id,
redeem_all,
amount,
dest_account,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
query_params.insert("productId".to_string(), json!(product_id));
if let Some(rw) = redeem_all {
query_params.insert("redeemAll".to_string(), json!(rw));
}
if let Some(rw) = amount {
query_params.insert("amount".to_string(), json!(rw));
}
if let Some(rw) = dest_account {
query_params.insert("destAccount".to_string(), json!(rw));
}
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::RedeemFlexibleProductResponse>(
&self.configuration,
"/sapi/v1/simple-earn/flexible/redeem",
reqwest::Method::POST,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn redeem_locked_product(
&self,
params: RedeemLockedProductParams,
) -> anyhow::Result<RestApiResponse<models::RedeemLockedProductResponse>> {
let RedeemLockedProductParams {
position_id,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
query_params.insert("positionId".to_string(), json!(position_id));
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::RedeemLockedProductResponse>(
&self.configuration,
"/sapi/v1/simple-earn/locked/redeem",
reqwest::Method::POST,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn set_flexible_auto_subscribe(
&self,
params: SetFlexibleAutoSubscribeParams,
) -> anyhow::Result<RestApiResponse<models::SetFlexibleAutoSubscribeResponse>> {
let SetFlexibleAutoSubscribeParams {
product_id,
auto_subscribe,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
query_params.insert("productId".to_string(), json!(product_id));
query_params.insert("autoSubscribe".to_string(), json!(auto_subscribe));
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::SetFlexibleAutoSubscribeResponse>(
&self.configuration,
"/sapi/v1/simple-earn/flexible/setAutoSubscribe",
reqwest::Method::POST,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn set_locked_auto_subscribe(
&self,
params: SetLockedAutoSubscribeParams,
) -> anyhow::Result<RestApiResponse<models::SetLockedAutoSubscribeResponse>> {
let SetLockedAutoSubscribeParams {
position_id,
auto_subscribe,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
query_params.insert("positionId".to_string(), json!(position_id));
query_params.insert("autoSubscribe".to_string(), json!(auto_subscribe));
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::SetLockedAutoSubscribeResponse>(
&self.configuration,
"/sapi/v1/simple-earn/locked/setAutoSubscribe",
reqwest::Method::POST,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn set_locked_product_redeem_option(
&self,
params: SetLockedProductRedeemOptionParams,
) -> anyhow::Result<RestApiResponse<models::SetLockedProductRedeemOptionResponse>> {
let SetLockedProductRedeemOptionParams {
position_id,
redeem_to,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
query_params.insert("positionId".to_string(), json!(position_id));
query_params.insert("redeemTo".to_string(), json!(redeem_to));
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::SetLockedProductRedeemOptionResponse>(
&self.configuration,
"/sapi/v1/simple-earn/locked/setRedeemOption",
reqwest::Method::POST,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn simple_account(
&self,
params: SimpleAccountParams,
) -> anyhow::Result<RestApiResponse<models::SimpleAccountResponse>> {
let SimpleAccountParams { recv_window } = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::SimpleAccountResponse>(
&self.configuration,
"/sapi/v1/simple-earn/account",
reqwest::Method::GET,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn subscribe_flexible_product(
&self,
params: SubscribeFlexibleProductParams,
) -> anyhow::Result<RestApiResponse<models::SubscribeFlexibleProductResponse>> {
let SubscribeFlexibleProductParams {
product_id,
amount,
auto_subscribe,
source_account,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
query_params.insert("productId".to_string(), json!(product_id));
query_params.insert("amount".to_string(), json!(amount));
if let Some(rw) = auto_subscribe {
query_params.insert("autoSubscribe".to_string(), json!(rw));
}
if let Some(rw) = source_account {
query_params.insert("sourceAccount".to_string(), json!(rw));
}
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::SubscribeFlexibleProductResponse>(
&self.configuration,
"/sapi/v1/simple-earn/flexible/subscribe",
reqwest::Method::POST,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
async fn subscribe_locked_product(
&self,
params: SubscribeLockedProductParams,
) -> anyhow::Result<RestApiResponse<models::SubscribeLockedProductResponse>> {
let SubscribeLockedProductParams {
project_id,
amount,
auto_subscribe,
source_account,
redeem_to,
recv_window,
} = params;
let mut query_params = BTreeMap::new();
let body_params = BTreeMap::new();
query_params.insert("projectId".to_string(), json!(project_id));
query_params.insert("amount".to_string(), json!(amount));
if let Some(rw) = auto_subscribe {
query_params.insert("autoSubscribe".to_string(), json!(rw));
}
if let Some(rw) = source_account {
query_params.insert("sourceAccount".to_string(), json!(rw));
}
if let Some(rw) = redeem_to {
query_params.insert("redeemTo".to_string(), json!(rw));
}
if let Some(rw) = recv_window {
query_params.insert("recvWindow".to_string(), json!(rw));
}
send_request::<models::SubscribeLockedProductResponse>(
&self.configuration,
"/sapi/v1/simple-earn/locked/subscribe",
reqwest::Method::POST,
query_params,
body_params,
if HAS_TIME_UNIT {
self.configuration.time_unit
} else {
None
},
true,
)
.await
}
}
#[cfg(all(test, feature = "simple_earn"))]
mod tests {
use super::*;
use crate::TOKIO_SHARED_RT;
use crate::{errors::ConnectorError, models::DataFuture, models::RestApiRateLimit};
use async_trait::async_trait;
use std::collections::HashMap;
struct DummyRestApiResponse<T> {
inner: Box<dyn FnOnce() -> DataFuture<Result<T, ConnectorError>> + Send + Sync>,
status: u16,
headers: HashMap<String, String>,
rate_limits: Option<Vec<RestApiRateLimit>>,
}
impl<T> From<DummyRestApiResponse<T>> for RestApiResponse<T> {
fn from(dummy: DummyRestApiResponse<T>) -> Self {
Self {
data_fn: dummy.inner,
status: dummy.status,
headers: dummy.headers,
rate_limits: dummy.rate_limits,
}
}
}
struct MockFlexibleLockedApiClient {
force_error: bool,
}
#[async_trait]
impl FlexibleLockedApi for MockFlexibleLockedApiClient {
async fn get_collateral_record(
&self,
_params: GetCollateralRecordParams,
) -> anyhow::Result<RestApiResponse<models::GetCollateralRecordResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"amount":"100.00000000","productId":"BUSD001","asset":"USDT","createTime":1575018510000,"type":"REPAY","productName":"USDT","orderId":26055}],"total":"1"}"#).unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::GetCollateralRecordResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetCollateralRecordResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn get_flexible_personal_left_quota(
&self,
_params: GetFlexiblePersonalLeftQuotaParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexiblePersonalLeftQuotaResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"leftPersonalQuota":"1000"}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::GetFlexiblePersonalLeftQuotaResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetFlexiblePersonalLeftQuotaResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn get_flexible_product_position(
&self,
_params: GetFlexibleProductPositionParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexibleProductPositionResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"totalAmount":"75.46000000","tierAnnualPercentageRate":{"0-5BTC":0.05,"5-10BTC":0.03},"latestAnnualPercentageRate":"0.02599895","yesterdayAirdropPercentageRate":"0.02599895","asset":"USDT","airDropAsset":"BETH","canRedeem":true,"collateralAmount":"232.23123213","productId":"USDT001","yesterdayRealTimeRewards":"0.10293829","cumulativeBonusRewards":"0.22759183","cumulativeRealTimeRewards":"0.22759183","cumulativeTotalRewards":"0.45459183","autoSubscribe":true}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::GetFlexibleProductPositionResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetFlexibleProductPositionResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn get_flexible_redemption_record(
&self,
_params: GetFlexibleRedemptionRecordParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexibleRedemptionRecordResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"amount":"10.54000000","asset":"USDT","time":1577257222000,"projectId":"USDT001","redeemId":40607,"destAccount":"SPOT","status":"PAID"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::GetFlexibleRedemptionRecordResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetFlexibleRedemptionRecordResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn get_flexible_rewards_history(
&self,
_params: GetFlexibleRewardsHistoryParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexibleRewardsHistoryResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"asset":"BUSD","rewards":"0.00006408","projectId":"USDT001","type":"BONUS","time":1577233578000}],"total":2}"#).unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::GetFlexibleRewardsHistoryResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetFlexibleRewardsHistoryResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn get_flexible_subscription_preview(
&self,
_params: GetFlexibleSubscriptionPreviewParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexibleSubscriptionPreviewResponse>>
{
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"totalAmount":"1232.32230982","rewardAsset":"BUSD","airDropAsset":"BETH","estDailyBonusRewards":"0.22759183","estDailyRealTimeRewards":"0.22759183","estDailyAirdropRewards":"0.22759183"}"#).unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::GetFlexibleSubscriptionPreviewResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetFlexibleSubscriptionPreviewResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn get_flexible_subscription_record(
&self,
_params: GetFlexibleSubscriptionRecordParams,
) -> anyhow::Result<RestApiResponse<models::GetFlexibleSubscriptionRecordResponse>>
{
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"amount":"100.00000000","asset":"USDT","time":1575018510000,"purchaseId":26055,"productId":"USDT001","type":"AUTO","sourceAccount":"SPOT","amtFromSpot":"30","amtFromFunding":"70","status":"SUCCESS"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::GetFlexibleSubscriptionRecordResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetFlexibleSubscriptionRecordResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn get_locked_personal_left_quota(
&self,
_params: GetLockedPersonalLeftQuotaParams,
) -> anyhow::Result<RestApiResponse<models::GetLockedPersonalLeftQuotaResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"leftPersonalQuota":"1000"}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::GetLockedPersonalLeftQuotaResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetLockedPersonalLeftQuotaResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn get_locked_product_position(
&self,
_params: GetLockedProductPositionParams,
) -> anyhow::Result<RestApiResponse<models::GetLockedProductPositionResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":123123,"parentPositionId":123122,"projectId":"Axs*90","asset":"AXS","amount":"122.09202928","purchaseTime":1646182276000,"duration":"60","accrualDays":"4","rewardAsset":"AXS","APY":"0.2032","rewardAmt":"5.17181528","extraRewardAsset":"BNB","extraRewardAPR":"0.0203","estExtraRewardAmt":"5.17181528","boostRewardAsset":"AXS","boostApr":"0.0121","totalBoostRewardAmt":"3.98201829","nextPay":"1.29295383","nextPayDate":1646697600000,"payPeriod":"1","redeemAmountEarly":"2802.24068892","rewardsEndDate":1651449600000,"deliverDate":1651536000000,"redeemPeriod":"1","redeemingAmt":"232.2323","redeemTo":"FLEXIBLE","partialAmtDeliverDate":1651536000000,"canRedeemEarly":true,"canFastRedemption":true,"autoSubscribe":true,"type":"AUTO","status":"HOLDING","canReStake":true}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::GetLockedProductPositionResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetLockedProductPositionResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn get_locked_redemption_record(
&self,
_params: GetLockedRedemptionRecordParams,
) -> anyhow::Result<RestApiResponse<models::GetLockedRedemptionRecordResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":123123,"redeemId":40607,"time":1575018510000,"asset":"BNB","lockPeriod":"30","amount":"21312.23223","originalAmount":"21312.23223","type":"MATURE","deliverDate":1575018510000,"lossAmount":"0.00001232","isComplete":true,"rewardAsset":"AXS","rewardAmt":"5.17181528","extraRewardAsset":"BNB","estExtraRewardAmt":"5.17181528","status":"PAID"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::GetLockedRedemptionRecordResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetLockedRedemptionRecordResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn get_locked_rewards_history(
&self,
_params: GetLockedRewardsHistoryParams,
) -> anyhow::Result<RestApiResponse<models::GetLockedRewardsHistoryResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":123123,"time":1575018510000,"asset":"BNB","lockPeriod":"30","amount":"21312.23223","type":"Locked Rewards"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::GetLockedRewardsHistoryResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetLockedRewardsHistoryResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn get_locked_subscription_preview(
&self,
_params: GetLockedSubscriptionPreviewParams,
) -> anyhow::Result<RestApiResponse<Vec<models::GetLockedSubscriptionPreviewResponseInner>>>
{
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"[{"rewardAsset":"AXS","totalRewardAmt":"5.17181528","extraRewardAsset":"BNB","estTotalExtraRewardAmt":"5.17181528","boostRewardAsset":"AXS","estDailyRewardAmt":"1.20928901","nextPay":"1.29295383","nextPayDate":1646697600000,"valueDate":1646697600000,"rewardsEndDate":1651449600000,"deliverDate":1651536000000,"nextSubscriptionDate":1651536000000}]"#).unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: Vec<models::GetLockedSubscriptionPreviewResponseInner> =
serde_json::from_value(resp_json.clone()).expect(
"should parse into Vec<models::GetLockedSubscriptionPreviewResponseInner>",
);
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn get_locked_subscription_record(
&self,
_params: GetLockedSubscriptionRecordParams,
) -> anyhow::Result<RestApiResponse<models::GetLockedSubscriptionRecordResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":123123,"purchaseId":"26055","projectId":"Axs*90","time":1575018510000,"asset":"BNB","amount":"21312.23223","lockPeriod":"30","type":"AUTO","sourceAccount":"SPOT","amtFromSpot":"30","amtFromFunding":"70","status":"SUCCESS"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::GetLockedSubscriptionRecordResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetLockedSubscriptionRecordResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn get_rate_history(
&self,
_params: GetRateHistoryParams,
) -> anyhow::Result<RestApiResponse<models::GetRateHistoryResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"productId":"BUSD001","asset":"BUSD","annualPercentageRate":"0.00006408","time":1577233578000}],"total":"1"}"#).unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::GetRateHistoryResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetRateHistoryResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn get_simple_earn_flexible_product_list(
&self,
_params: GetSimpleEarnFlexibleProductListParams,
) -> anyhow::Result<RestApiResponse<models::GetSimpleEarnFlexibleProductListResponse>>
{
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"asset":"BTC","latestAnnualPercentageRate":"0.05000000","tierAnnualPercentageRate":{"0-5BTC":0.05,"5-10BTC":0.03},"airDropPercentageRate":"0.05000000","canPurchase":true,"canRedeem":true,"isSoldOut":true,"hot":true,"minPurchaseAmount":"0.01000000","productId":"BTC001","subscriptionStartTime":1646182276000,"status":"PURCHASING"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::GetSimpleEarnFlexibleProductListResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetSimpleEarnFlexibleProductListResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn get_simple_earn_locked_product_list(
&self,
_params: GetSimpleEarnLockedProductListParams,
) -> anyhow::Result<RestApiResponse<models::GetSimpleEarnLockedProductListResponse>>
{
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"projectId":"Axs*90","detail":{"asset":"AXS","rewardAsset":"AXS","duration":90,"renewable":true,"isSoldOut":true,"apr":"1.2069","status":"CREATED","subscriptionStartTime":1646182276000,"extraRewardAsset":"BNB","extraRewardAPR":"0.23","boostRewardAsset":"AXS","boostApr":"0.0121","boostEndTime":1646182276000},"quota":{"totalPersonalQuota":"2","minimum":"0.001"}}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::GetSimpleEarnLockedProductListResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetSimpleEarnLockedProductListResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn redeem_flexible_product(
&self,
_params: RedeemFlexibleProductParams,
) -> anyhow::Result<RestApiResponse<models::RedeemFlexibleProductResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"redeemId":40607,"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::RedeemFlexibleProductResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::RedeemFlexibleProductResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn redeem_locked_product(
&self,
_params: RedeemLockedProductParams,
) -> anyhow::Result<RestApiResponse<models::RedeemLockedProductResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"redeemId":40607,"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::RedeemLockedProductResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::RedeemLockedProductResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn set_flexible_auto_subscribe(
&self,
_params: SetFlexibleAutoSubscribeParams,
) -> anyhow::Result<RestApiResponse<models::SetFlexibleAutoSubscribeResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::SetFlexibleAutoSubscribeResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::SetFlexibleAutoSubscribeResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn set_locked_auto_subscribe(
&self,
_params: SetLockedAutoSubscribeParams,
) -> anyhow::Result<RestApiResponse<models::SetLockedAutoSubscribeResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::SetLockedAutoSubscribeResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::SetLockedAutoSubscribeResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn set_locked_product_redeem_option(
&self,
_params: SetLockedProductRedeemOptionParams,
) -> anyhow::Result<RestApiResponse<models::SetLockedProductRedeemOptionResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::SetLockedProductRedeemOptionResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::SetLockedProductRedeemOptionResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn simple_account(
&self,
_params: SimpleAccountParams,
) -> anyhow::Result<RestApiResponse<models::SimpleAccountResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"totalAmountInBTC":"0.01067982","totalAmountInUSDT":"77.13289230","totalFlexibleAmountInBTC":"0.00000000","totalFlexibleAmountInUSDT":"0.00000000","totalLockedInBTC":"0.01067982","totalLockedInUSDT":"77.13289230"}"#).unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::SimpleAccountResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::SimpleAccountResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn subscribe_flexible_product(
&self,
_params: SubscribeFlexibleProductParams,
) -> anyhow::Result<RestApiResponse<models::SubscribeFlexibleProductResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value = serde_json::from_str(r#"{"purchaseId":40607,"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::SubscribeFlexibleProductResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::SubscribeFlexibleProductResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
async fn subscribe_locked_product(
&self,
_params: SubscribeLockedProductParams,
) -> anyhow::Result<RestApiResponse<models::SubscribeLockedProductResponse>> {
if self.force_error {
return Err(ConnectorError::ConnectorClientError {
msg: "ResponseError".to_string(),
code: None,
}
.into());
}
let resp_json: Value =
serde_json::from_str(r#"{"purchaseId":40607,"positionId":"12345","success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let dummy_response: models::SubscribeLockedProductResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::SubscribeLockedProductResponse");
let dummy = DummyRestApiResponse {
inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
status: 200,
headers: HashMap::new(),
rate_limits: None,
};
Ok(dummy.into())
}
}
#[test]
fn get_collateral_record_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetCollateralRecordParams::builder().build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"amount":"100.00000000","productId":"BUSD001","asset":"USDT","createTime":1575018510000,"type":"REPAY","productName":"USDT","orderId":26055}],"total":"1"}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetCollateralRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetCollateralRecordResponse");
let resp = client.get_collateral_record(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_collateral_record_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetCollateralRecordParams::builder().product_id("1".to_string()).start_time(1623319461670).end_time(1641782889000).current(1).size(10).recv_window(5000).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"amount":"100.00000000","productId":"BUSD001","asset":"USDT","createTime":1575018510000,"type":"REPAY","productName":"USDT","orderId":26055}],"total":"1"}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetCollateralRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetCollateralRecordResponse");
let resp = client.get_collateral_record(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_collateral_record_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = GetCollateralRecordParams::builder().build().unwrap();
match client.get_collateral_record(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn get_flexible_personal_left_quota_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetFlexiblePersonalLeftQuotaParams::builder("1".to_string())
.build()
.unwrap();
let resp_json: Value = serde_json::from_str(r#"{"leftPersonalQuota":"1000"}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::GetFlexiblePersonalLeftQuotaResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetFlexiblePersonalLeftQuotaResponse");
let resp = client
.get_flexible_personal_left_quota(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_flexible_personal_left_quota_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetFlexiblePersonalLeftQuotaParams::builder("1".to_string())
.recv_window(5000)
.build()
.unwrap();
let resp_json: Value = serde_json::from_str(r#"{"leftPersonalQuota":"1000"}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::GetFlexiblePersonalLeftQuotaResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetFlexiblePersonalLeftQuotaResponse");
let resp = client
.get_flexible_personal_left_quota(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_flexible_personal_left_quota_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = GetFlexiblePersonalLeftQuotaParams::builder("1".to_string())
.build()
.unwrap();
match client.get_flexible_personal_left_quota(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn get_flexible_product_position_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetFlexibleProductPositionParams::builder().build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"totalAmount":"75.46000000","tierAnnualPercentageRate":{"0-5BTC":0.05,"5-10BTC":0.03},"latestAnnualPercentageRate":"0.02599895","yesterdayAirdropPercentageRate":"0.02599895","asset":"USDT","airDropAsset":"BETH","canRedeem":true,"collateralAmount":"232.23123213","productId":"USDT001","yesterdayRealTimeRewards":"0.10293829","cumulativeBonusRewards":"0.22759183","cumulativeRealTimeRewards":"0.22759183","cumulativeTotalRewards":"0.45459183","autoSubscribe":true}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetFlexibleProductPositionResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleProductPositionResponse");
let resp = client.get_flexible_product_position(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_flexible_product_position_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetFlexibleProductPositionParams::builder().asset("USDC".to_string()).product_id("1".to_string()).current(1).size(10).recv_window(5000).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"totalAmount":"75.46000000","tierAnnualPercentageRate":{"0-5BTC":0.05,"5-10BTC":0.03},"latestAnnualPercentageRate":"0.02599895","yesterdayAirdropPercentageRate":"0.02599895","asset":"USDT","airDropAsset":"BETH","canRedeem":true,"collateralAmount":"232.23123213","productId":"USDT001","yesterdayRealTimeRewards":"0.10293829","cumulativeBonusRewards":"0.22759183","cumulativeRealTimeRewards":"0.22759183","cumulativeTotalRewards":"0.45459183","autoSubscribe":true}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetFlexibleProductPositionResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleProductPositionResponse");
let resp = client.get_flexible_product_position(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_flexible_product_position_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = GetFlexibleProductPositionParams::builder().build().unwrap();
match client.get_flexible_product_position(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn get_flexible_redemption_record_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetFlexibleRedemptionRecordParams::builder().build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"amount":"10.54000000","asset":"USDT","time":1577257222000,"projectId":"USDT001","redeemId":40607,"destAccount":"SPOT","status":"PAID"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetFlexibleRedemptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleRedemptionRecordResponse");
let resp = client.get_flexible_redemption_record(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_flexible_redemption_record_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetFlexibleRedemptionRecordParams::builder().product_id("1".to_string()).redeem_id("1".to_string()).asset("USDC".to_string()).start_time(1623319461670).end_time(1641782889000).current(1).size(10).recv_window(5000).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"amount":"10.54000000","asset":"USDT","time":1577257222000,"projectId":"USDT001","redeemId":40607,"destAccount":"SPOT","status":"PAID"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetFlexibleRedemptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleRedemptionRecordResponse");
let resp = client.get_flexible_redemption_record(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_flexible_redemption_record_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = GetFlexibleRedemptionRecordParams::builder()
.build()
.unwrap();
match client.get_flexible_redemption_record(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn get_flexible_rewards_history_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetFlexibleRewardsHistoryParams::builder().build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"asset":"BUSD","rewards":"0.00006408","projectId":"USDT001","type":"BONUS","time":1577233578000}],"total":2}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetFlexibleRewardsHistoryResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleRewardsHistoryResponse");
let resp = client.get_flexible_rewards_history(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_flexible_rewards_history_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetFlexibleRewardsHistoryParams::builder().product_id("1".to_string()).asset("USDC".to_string()).start_time(1623319461670).end_time(1641782889000).r#type(GetFlexibleRewardsHistoryTypeEnum::Bonus).current(1).size(10).recv_window(5000).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"asset":"BUSD","rewards":"0.00006408","projectId":"USDT001","type":"BONUS","time":1577233578000}],"total":2}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetFlexibleRewardsHistoryResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleRewardsHistoryResponse");
let resp = client.get_flexible_rewards_history(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_flexible_rewards_history_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = GetFlexibleRewardsHistoryParams::builder().build().unwrap();
match client.get_flexible_rewards_history(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn get_flexible_subscription_preview_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetFlexibleSubscriptionPreviewParams::builder("1".to_string(),dec!(1.0),).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"totalAmount":"1232.32230982","rewardAsset":"BUSD","airDropAsset":"BETH","estDailyBonusRewards":"0.22759183","estDailyRealTimeRewards":"0.22759183","estDailyAirdropRewards":"0.22759183"}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetFlexibleSubscriptionPreviewResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleSubscriptionPreviewResponse");
let resp = client.get_flexible_subscription_preview(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_flexible_subscription_preview_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetFlexibleSubscriptionPreviewParams::builder("1".to_string(),dec!(1.0),).recv_window(5000).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"totalAmount":"1232.32230982","rewardAsset":"BUSD","airDropAsset":"BETH","estDailyBonusRewards":"0.22759183","estDailyRealTimeRewards":"0.22759183","estDailyAirdropRewards":"0.22759183"}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetFlexibleSubscriptionPreviewResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleSubscriptionPreviewResponse");
let resp = client.get_flexible_subscription_preview(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_flexible_subscription_preview_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = GetFlexibleSubscriptionPreviewParams::builder("1".to_string(), dec!(1.0))
.build()
.unwrap();
match client.get_flexible_subscription_preview(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn get_flexible_subscription_record_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetFlexibleSubscriptionRecordParams::builder().build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"amount":"100.00000000","asset":"USDT","time":1575018510000,"purchaseId":26055,"productId":"USDT001","type":"AUTO","sourceAccount":"SPOT","amtFromSpot":"30","amtFromFunding":"70","status":"SUCCESS"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetFlexibleSubscriptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleSubscriptionRecordResponse");
let resp = client.get_flexible_subscription_record(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_flexible_subscription_record_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetFlexibleSubscriptionRecordParams::builder().product_id("1".to_string()).purchase_id("1".to_string()).asset("USDC".to_string()).start_time(1623319461670).end_time(1641782889000).current(1).size(10).recv_window(5000).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"amount":"100.00000000","asset":"USDT","time":1575018510000,"purchaseId":26055,"productId":"USDT001","type":"AUTO","sourceAccount":"SPOT","amtFromSpot":"30","amtFromFunding":"70","status":"SUCCESS"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetFlexibleSubscriptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleSubscriptionRecordResponse");
let resp = client.get_flexible_subscription_record(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_flexible_subscription_record_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = GetFlexibleSubscriptionRecordParams::builder()
.build()
.unwrap();
match client.get_flexible_subscription_record(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn get_locked_personal_left_quota_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetLockedPersonalLeftQuotaParams::builder("1".to_string())
.build()
.unwrap();
let resp_json: Value = serde_json::from_str(r#"{"leftPersonalQuota":"1000"}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::GetLockedPersonalLeftQuotaResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetLockedPersonalLeftQuotaResponse");
let resp = client
.get_locked_personal_left_quota(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_locked_personal_left_quota_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetLockedPersonalLeftQuotaParams::builder("1".to_string())
.recv_window(5000)
.build()
.unwrap();
let resp_json: Value = serde_json::from_str(r#"{"leftPersonalQuota":"1000"}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::GetLockedPersonalLeftQuotaResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::GetLockedPersonalLeftQuotaResponse");
let resp = client
.get_locked_personal_left_quota(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_locked_personal_left_quota_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = GetLockedPersonalLeftQuotaParams::builder("1".to_string())
.build()
.unwrap();
match client.get_locked_personal_left_quota(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn get_locked_product_position_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetLockedProductPositionParams::builder().build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":123123,"parentPositionId":123122,"projectId":"Axs*90","asset":"AXS","amount":"122.09202928","purchaseTime":1646182276000,"duration":"60","accrualDays":"4","rewardAsset":"AXS","APY":"0.2032","rewardAmt":"5.17181528","extraRewardAsset":"BNB","extraRewardAPR":"0.0203","estExtraRewardAmt":"5.17181528","boostRewardAsset":"AXS","boostApr":"0.0121","totalBoostRewardAmt":"3.98201829","nextPay":"1.29295383","nextPayDate":1646697600000,"payPeriod":"1","redeemAmountEarly":"2802.24068892","rewardsEndDate":1651449600000,"deliverDate":1651536000000,"redeemPeriod":"1","redeemingAmt":"232.2323","redeemTo":"FLEXIBLE","partialAmtDeliverDate":1651536000000,"canRedeemEarly":true,"canFastRedemption":true,"autoSubscribe":true,"type":"AUTO","status":"HOLDING","canReStake":true}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetLockedProductPositionResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetLockedProductPositionResponse");
let resp = client.get_locked_product_position(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_locked_product_position_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetLockedProductPositionParams::builder().asset("USDC".to_string()).position_id("1".to_string()).project_id("1".to_string()).current(1).size(10).recv_window(5000).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":123123,"parentPositionId":123122,"projectId":"Axs*90","asset":"AXS","amount":"122.09202928","purchaseTime":1646182276000,"duration":"60","accrualDays":"4","rewardAsset":"AXS","APY":"0.2032","rewardAmt":"5.17181528","extraRewardAsset":"BNB","extraRewardAPR":"0.0203","estExtraRewardAmt":"5.17181528","boostRewardAsset":"AXS","boostApr":"0.0121","totalBoostRewardAmt":"3.98201829","nextPay":"1.29295383","nextPayDate":1646697600000,"payPeriod":"1","redeemAmountEarly":"2802.24068892","rewardsEndDate":1651449600000,"deliverDate":1651536000000,"redeemPeriod":"1","redeemingAmt":"232.2323","redeemTo":"FLEXIBLE","partialAmtDeliverDate":1651536000000,"canRedeemEarly":true,"canFastRedemption":true,"autoSubscribe":true,"type":"AUTO","status":"HOLDING","canReStake":true}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetLockedProductPositionResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetLockedProductPositionResponse");
let resp = client.get_locked_product_position(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_locked_product_position_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = GetLockedProductPositionParams::builder().build().unwrap();
match client.get_locked_product_position(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn get_locked_redemption_record_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetLockedRedemptionRecordParams::builder().build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":123123,"redeemId":40607,"time":1575018510000,"asset":"BNB","lockPeriod":"30","amount":"21312.23223","originalAmount":"21312.23223","type":"MATURE","deliverDate":1575018510000,"lossAmount":"0.00001232","isComplete":true,"rewardAsset":"AXS","rewardAmt":"5.17181528","extraRewardAsset":"BNB","estExtraRewardAmt":"5.17181528","status":"PAID"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetLockedRedemptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetLockedRedemptionRecordResponse");
let resp = client.get_locked_redemption_record(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_locked_redemption_record_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetLockedRedemptionRecordParams::builder().position_id("1".to_string()).redeem_id("1".to_string()).asset("USDC".to_string()).start_time(1623319461670).end_time(1641782889000).current(1).size(10).recv_window(5000).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":123123,"redeemId":40607,"time":1575018510000,"asset":"BNB","lockPeriod":"30","amount":"21312.23223","originalAmount":"21312.23223","type":"MATURE","deliverDate":1575018510000,"lossAmount":"0.00001232","isComplete":true,"rewardAsset":"AXS","rewardAmt":"5.17181528","extraRewardAsset":"BNB","estExtraRewardAmt":"5.17181528","status":"PAID"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetLockedRedemptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetLockedRedemptionRecordResponse");
let resp = client.get_locked_redemption_record(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_locked_redemption_record_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = GetLockedRedemptionRecordParams::builder().build().unwrap();
match client.get_locked_redemption_record(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn get_locked_rewards_history_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetLockedRewardsHistoryParams::builder().build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":123123,"time":1575018510000,"asset":"BNB","lockPeriod":"30","amount":"21312.23223","type":"Locked Rewards"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetLockedRewardsHistoryResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetLockedRewardsHistoryResponse");
let resp = client.get_locked_rewards_history(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_locked_rewards_history_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetLockedRewardsHistoryParams::builder().position_id("1".to_string()).asset("USDC".to_string()).start_time(1623319461670).end_time(1641782889000).current(1).size(10).recv_window(5000).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":123123,"time":1575018510000,"asset":"BNB","lockPeriod":"30","amount":"21312.23223","type":"Locked Rewards"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetLockedRewardsHistoryResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetLockedRewardsHistoryResponse");
let resp = client.get_locked_rewards_history(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_locked_rewards_history_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = GetLockedRewardsHistoryParams::builder().build().unwrap();
match client.get_locked_rewards_history(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn get_locked_subscription_preview_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetLockedSubscriptionPreviewParams::builder("1".to_string(),dec!(1.0),).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"[{"rewardAsset":"AXS","totalRewardAmt":"5.17181528","extraRewardAsset":"BNB","estTotalExtraRewardAmt":"5.17181528","boostRewardAsset":"AXS","estDailyRewardAmt":"1.20928901","nextPay":"1.29295383","nextPayDate":1646697600000,"valueDate":1646697600000,"rewardsEndDate":1651449600000,"deliverDate":1651536000000,"nextSubscriptionDate":1651536000000}]"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : Vec<models::GetLockedSubscriptionPreviewResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::GetLockedSubscriptionPreviewResponseInner>");
let resp = client.get_locked_subscription_preview(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_locked_subscription_preview_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetLockedSubscriptionPreviewParams::builder("1".to_string(),dec!(1.0),).auto_subscribe(true).recv_window(5000).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"[{"rewardAsset":"AXS","totalRewardAmt":"5.17181528","extraRewardAsset":"BNB","estTotalExtraRewardAmt":"5.17181528","boostRewardAsset":"AXS","estDailyRewardAmt":"1.20928901","nextPay":"1.29295383","nextPayDate":1646697600000,"valueDate":1646697600000,"rewardsEndDate":1651449600000,"deliverDate":1651536000000,"nextSubscriptionDate":1651536000000}]"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : Vec<models::GetLockedSubscriptionPreviewResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::GetLockedSubscriptionPreviewResponseInner>");
let resp = client.get_locked_subscription_preview(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_locked_subscription_preview_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = GetLockedSubscriptionPreviewParams::builder("1".to_string(), dec!(1.0))
.build()
.unwrap();
match client.get_locked_subscription_preview(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn get_locked_subscription_record_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetLockedSubscriptionRecordParams::builder().build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":123123,"purchaseId":"26055","projectId":"Axs*90","time":1575018510000,"asset":"BNB","amount":"21312.23223","lockPeriod":"30","type":"AUTO","sourceAccount":"SPOT","amtFromSpot":"30","amtFromFunding":"70","status":"SUCCESS"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetLockedSubscriptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetLockedSubscriptionRecordResponse");
let resp = client.get_locked_subscription_record(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_locked_subscription_record_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetLockedSubscriptionRecordParams::builder().purchase_id("1".to_string()).asset("USDC".to_string()).start_time(1623319461670).end_time(1641782889000).current(1).size(10).recv_window(5000).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"positionId":123123,"purchaseId":"26055","projectId":"Axs*90","time":1575018510000,"asset":"BNB","amount":"21312.23223","lockPeriod":"30","type":"AUTO","sourceAccount":"SPOT","amtFromSpot":"30","amtFromFunding":"70","status":"SUCCESS"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetLockedSubscriptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetLockedSubscriptionRecordResponse");
let resp = client.get_locked_subscription_record(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_locked_subscription_record_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = GetLockedSubscriptionRecordParams::builder()
.build()
.unwrap();
match client.get_locked_subscription_record(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn get_rate_history_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetRateHistoryParams::builder("1".to_string(),).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"productId":"BUSD001","asset":"BUSD","annualPercentageRate":"0.00006408","time":1577233578000}],"total":"1"}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetRateHistoryResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetRateHistoryResponse");
let resp = client.get_rate_history(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_rate_history_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetRateHistoryParams::builder("1".to_string(),).apr_period(GetRateHistoryAprPeriodEnum::Day).start_time(1623319461670).end_time(1641782889000).current(1).size(10).recv_window(5000).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"productId":"BUSD001","asset":"BUSD","annualPercentageRate":"0.00006408","time":1577233578000}],"total":"1"}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetRateHistoryResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetRateHistoryResponse");
let resp = client.get_rate_history(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_rate_history_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = GetRateHistoryParams::builder("1".to_string())
.build()
.unwrap();
match client.get_rate_history(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn get_simple_earn_flexible_product_list_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetSimpleEarnFlexibleProductListParams::builder().build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"asset":"BTC","latestAnnualPercentageRate":"0.05000000","tierAnnualPercentageRate":{"0-5BTC":0.05,"5-10BTC":0.03},"airDropPercentageRate":"0.05000000","canPurchase":true,"canRedeem":true,"isSoldOut":true,"hot":true,"minPurchaseAmount":"0.01000000","productId":"BTC001","subscriptionStartTime":1646182276000,"status":"PURCHASING"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetSimpleEarnFlexibleProductListResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetSimpleEarnFlexibleProductListResponse");
let resp = client.get_simple_earn_flexible_product_list(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_simple_earn_flexible_product_list_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetSimpleEarnFlexibleProductListParams::builder().asset("USDC".to_string()).current(1).size(10).recv_window(5000).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"asset":"BTC","latestAnnualPercentageRate":"0.05000000","tierAnnualPercentageRate":{"0-5BTC":0.05,"5-10BTC":0.03},"airDropPercentageRate":"0.05000000","canPurchase":true,"canRedeem":true,"isSoldOut":true,"hot":true,"minPurchaseAmount":"0.01000000","productId":"BTC001","subscriptionStartTime":1646182276000,"status":"PURCHASING"}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetSimpleEarnFlexibleProductListResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetSimpleEarnFlexibleProductListResponse");
let resp = client.get_simple_earn_flexible_product_list(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_simple_earn_flexible_product_list_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = GetSimpleEarnFlexibleProductListParams::builder()
.build()
.unwrap();
match client.get_simple_earn_flexible_product_list(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn get_simple_earn_locked_product_list_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetSimpleEarnLockedProductListParams::builder().build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"projectId":"Axs*90","detail":{"asset":"AXS","rewardAsset":"AXS","duration":90,"renewable":true,"isSoldOut":true,"apr":"1.2069","status":"CREATED","subscriptionStartTime":1646182276000,"extraRewardAsset":"BNB","extraRewardAPR":"0.23","boostRewardAsset":"AXS","boostApr":"0.0121","boostEndTime":1646182276000},"quota":{"totalPersonalQuota":"2","minimum":"0.001"}}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetSimpleEarnLockedProductListResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetSimpleEarnLockedProductListResponse");
let resp = client.get_simple_earn_locked_product_list(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_simple_earn_locked_product_list_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = GetSimpleEarnLockedProductListParams::builder().asset("USDC".to_string()).current(1).size(10).recv_window(5000).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"rows":[{"projectId":"Axs*90","detail":{"asset":"AXS","rewardAsset":"AXS","duration":90,"renewable":true,"isSoldOut":true,"apr":"1.2069","status":"CREATED","subscriptionStartTime":1646182276000,"extraRewardAsset":"BNB","extraRewardAPR":"0.23","boostRewardAsset":"AXS","boostApr":"0.0121","boostEndTime":1646182276000},"quota":{"totalPersonalQuota":"2","minimum":"0.001"}}],"total":1}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::GetSimpleEarnLockedProductListResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetSimpleEarnLockedProductListResponse");
let resp = client.get_simple_earn_locked_product_list(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn get_simple_earn_locked_product_list_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = GetSimpleEarnLockedProductListParams::builder()
.build()
.unwrap();
match client.get_simple_earn_locked_product_list(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn redeem_flexible_product_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = RedeemFlexibleProductParams::builder("1".to_string())
.build()
.unwrap();
let resp_json: Value = serde_json::from_str(r#"{"redeemId":40607,"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::RedeemFlexibleProductResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::RedeemFlexibleProductResponse");
let resp = client
.redeem_flexible_product(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn redeem_flexible_product_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = RedeemFlexibleProductParams::builder("1".to_string())
.redeem_all(false)
.amount(dec!(1.0))
.dest_account(RedeemFlexibleProductDestAccountEnum::Spot)
.recv_window(5000)
.build()
.unwrap();
let resp_json: Value = serde_json::from_str(r#"{"redeemId":40607,"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::RedeemFlexibleProductResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::RedeemFlexibleProductResponse");
let resp = client
.redeem_flexible_product(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn redeem_flexible_product_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = RedeemFlexibleProductParams::builder("1".to_string())
.build()
.unwrap();
match client.redeem_flexible_product(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn redeem_locked_product_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = RedeemLockedProductParams::builder("1".to_string())
.build()
.unwrap();
let resp_json: Value = serde_json::from_str(r#"{"redeemId":40607,"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::RedeemLockedProductResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::RedeemLockedProductResponse");
let resp = client
.redeem_locked_product(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn redeem_locked_product_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = RedeemLockedProductParams::builder("1".to_string())
.recv_window(5000)
.build()
.unwrap();
let resp_json: Value = serde_json::from_str(r#"{"redeemId":40607,"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::RedeemLockedProductResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::RedeemLockedProductResponse");
let resp = client
.redeem_locked_product(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn redeem_locked_product_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = RedeemLockedProductParams::builder("1".to_string())
.build()
.unwrap();
match client.redeem_locked_product(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn set_flexible_auto_subscribe_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = SetFlexibleAutoSubscribeParams::builder("1".to_string(), true)
.build()
.unwrap();
let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::SetFlexibleAutoSubscribeResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::SetFlexibleAutoSubscribeResponse");
let resp = client
.set_flexible_auto_subscribe(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn set_flexible_auto_subscribe_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = SetFlexibleAutoSubscribeParams::builder("1".to_string(), true)
.recv_window(5000)
.build()
.unwrap();
let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::SetFlexibleAutoSubscribeResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::SetFlexibleAutoSubscribeResponse");
let resp = client
.set_flexible_auto_subscribe(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn set_flexible_auto_subscribe_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = SetFlexibleAutoSubscribeParams::builder("1".to_string(), true)
.build()
.unwrap();
match client.set_flexible_auto_subscribe(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn set_locked_auto_subscribe_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = SetLockedAutoSubscribeParams::builder("1".to_string(), true)
.build()
.unwrap();
let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::SetLockedAutoSubscribeResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::SetLockedAutoSubscribeResponse");
let resp = client
.set_locked_auto_subscribe(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn set_locked_auto_subscribe_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = SetLockedAutoSubscribeParams::builder("1".to_string(), true)
.recv_window(5000)
.build()
.unwrap();
let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::SetLockedAutoSubscribeResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::SetLockedAutoSubscribeResponse");
let resp = client
.set_locked_auto_subscribe(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn set_locked_auto_subscribe_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = SetLockedAutoSubscribeParams::builder("1".to_string(), true)
.build()
.unwrap();
match client.set_locked_auto_subscribe(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn set_locked_product_redeem_option_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = SetLockedProductRedeemOptionParams::builder(
"1".to_string(),
SetLockedProductRedeemOptionRedeemToEnum::Spot,
)
.build()
.unwrap();
let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::SetLockedProductRedeemOptionResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::SetLockedProductRedeemOptionResponse");
let resp = client
.set_locked_product_redeem_option(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn set_locked_product_redeem_option_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = SetLockedProductRedeemOptionParams::builder(
"1".to_string(),
SetLockedProductRedeemOptionRedeemToEnum::Spot,
)
.recv_window(5000)
.build()
.unwrap();
let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::SetLockedProductRedeemOptionResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::SetLockedProductRedeemOptionResponse");
let resp = client
.set_locked_product_redeem_option(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn set_locked_product_redeem_option_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = SetLockedProductRedeemOptionParams::builder(
"1".to_string(),
SetLockedProductRedeemOptionRedeemToEnum::Spot,
)
.build()
.unwrap();
match client.set_locked_product_redeem_option(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn simple_account_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = SimpleAccountParams::builder().build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"totalAmountInBTC":"0.01067982","totalAmountInUSDT":"77.13289230","totalFlexibleAmountInBTC":"0.00000000","totalFlexibleAmountInUSDT":"0.00000000","totalLockedInBTC":"0.01067982","totalLockedInUSDT":"77.13289230"}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::SimpleAccountResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::SimpleAccountResponse");
let resp = client.simple_account(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn simple_account_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = SimpleAccountParams::builder().recv_window(5000).build().unwrap();
let resp_json: Value = serde_json::from_str(r#"{"totalAmountInBTC":"0.01067982","totalAmountInUSDT":"77.13289230","totalFlexibleAmountInBTC":"0.00000000","totalFlexibleAmountInUSDT":"0.00000000","totalLockedInBTC":"0.01067982","totalLockedInUSDT":"77.13289230"}"#).unwrap_or_else(|_| serde_json::json!({}));
let expected_response : models::SimpleAccountResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::SimpleAccountResponse");
let resp = client.simple_account(params).await.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn simple_account_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = SimpleAccountParams::builder().build().unwrap();
match client.simple_account(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn subscribe_flexible_product_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = SubscribeFlexibleProductParams::builder("1".to_string(), dec!(1.0))
.build()
.unwrap();
let resp_json: Value = serde_json::from_str(r#"{"purchaseId":40607,"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::SubscribeFlexibleProductResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::SubscribeFlexibleProductResponse");
let resp = client
.subscribe_flexible_product(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn subscribe_flexible_product_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = SubscribeFlexibleProductParams::builder("1".to_string(), dec!(1.0))
.auto_subscribe(true)
.source_account(SubscribeFlexibleProductSourceAccountEnum::Spot)
.recv_window(5000)
.build()
.unwrap();
let resp_json: Value = serde_json::from_str(r#"{"purchaseId":40607,"success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::SubscribeFlexibleProductResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::SubscribeFlexibleProductResponse");
let resp = client
.subscribe_flexible_product(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn subscribe_flexible_product_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = SubscribeFlexibleProductParams::builder("1".to_string(), dec!(1.0))
.build()
.unwrap();
match client.subscribe_flexible_product(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
#[test]
fn subscribe_locked_product_required_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = SubscribeLockedProductParams::builder("1".to_string(), dec!(1.0))
.build()
.unwrap();
let resp_json: Value =
serde_json::from_str(r#"{"purchaseId":40607,"positionId":"12345","success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::SubscribeLockedProductResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::SubscribeLockedProductResponse");
let resp = client
.subscribe_locked_product(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn subscribe_locked_product_optional_params_success() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: false };
let params = SubscribeLockedProductParams::builder("1".to_string(), dec!(1.0))
.auto_subscribe(false)
.source_account(SubscribeLockedProductSourceAccountEnum::Spot)
.redeem_to(SubscribeLockedProductRedeemToEnum::Spot)
.recv_window(5000)
.build()
.unwrap();
let resp_json: Value =
serde_json::from_str(r#"{"purchaseId":40607,"positionId":"12345","success":true}"#)
.unwrap_or_else(|_| serde_json::json!({}));
let expected_response: models::SubscribeLockedProductResponse =
serde_json::from_value(resp_json.clone())
.expect("should parse into models::SubscribeLockedProductResponse");
let resp = client
.subscribe_locked_product(params)
.await
.expect("Expected a response");
let data_future = resp.data();
let actual_response = data_future.await.unwrap();
assert_eq!(actual_response, expected_response);
});
}
#[test]
fn subscribe_locked_product_response_error() {
TOKIO_SHARED_RT.block_on(async {
let client = MockFlexibleLockedApiClient { force_error: true };
let params = SubscribeLockedProductParams::builder("1".to_string(), dec!(1.0))
.build()
.unwrap();
match client.subscribe_locked_product(params).await {
Ok(_) => panic!("Expected an error"),
Err(err) => {
assert_eq!(err.to_string(), "Connector client error: ResponseError");
}
}
});
}
}