Skip to main content

binance_sdk/simple_earn/rest_api/apis/
flexible_locked_api.rs

1/*
2 * Simple Earn REST API
3 *
4 * Earn rewards by subscribing to flexible or locked Simple Earn products.
5 *
6 * The version of the OpenAPI document: 1.0.0
7 *
8 *
9 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
10 * https://openapi-generator.tech
11 * Do not edit the class manually.
12 */
13
14#![allow(unused_imports)]
15use async_trait::async_trait;
16use derive_builder::Builder;
17use reqwest;
18use rust_decimal::prelude::*;
19use serde::{Deserialize, Serialize};
20use serde_json::{Value, json};
21use std::collections::BTreeMap;
22
23use crate::common::{
24    config::ConfigurationRestApi,
25    models::{ParamBuildError, RestApiResponse},
26    utils::send_request,
27};
28use crate::simple_earn::rest_api::models;
29
30const HAS_TIME_UNIT: bool = false;
31
32#[async_trait]
33pub trait FlexibleLockedApi: Send + Sync {
34    async fn get_collateral_record(
35        &self,
36        params: GetCollateralRecordParams,
37    ) -> anyhow::Result<RestApiResponse<models::GetCollateralRecordResponse>>;
38    async fn get_flexible_personal_left_quota(
39        &self,
40        params: GetFlexiblePersonalLeftQuotaParams,
41    ) -> anyhow::Result<RestApiResponse<models::GetFlexiblePersonalLeftQuotaResponse>>;
42    async fn get_flexible_product_position(
43        &self,
44        params: GetFlexibleProductPositionParams,
45    ) -> anyhow::Result<RestApiResponse<models::GetFlexibleProductPositionResponse>>;
46    async fn get_flexible_redemption_record(
47        &self,
48        params: GetFlexibleRedemptionRecordParams,
49    ) -> anyhow::Result<RestApiResponse<models::GetFlexibleRedemptionRecordResponse>>;
50    async fn get_flexible_rewards_history(
51        &self,
52        params: GetFlexibleRewardsHistoryParams,
53    ) -> anyhow::Result<RestApiResponse<models::GetFlexibleRewardsHistoryResponse>>;
54    async fn get_flexible_subscription_preview(
55        &self,
56        params: GetFlexibleSubscriptionPreviewParams,
57    ) -> anyhow::Result<RestApiResponse<models::GetFlexibleSubscriptionPreviewResponse>>;
58    async fn get_flexible_subscription_record(
59        &self,
60        params: GetFlexibleSubscriptionRecordParams,
61    ) -> anyhow::Result<RestApiResponse<models::GetFlexibleSubscriptionRecordResponse>>;
62    async fn get_locked_personal_left_quota(
63        &self,
64        params: GetLockedPersonalLeftQuotaParams,
65    ) -> anyhow::Result<RestApiResponse<models::GetLockedPersonalLeftQuotaResponse>>;
66    async fn get_locked_product_position(
67        &self,
68        params: GetLockedProductPositionParams,
69    ) -> anyhow::Result<RestApiResponse<models::GetLockedProductPositionResponse>>;
70    async fn get_locked_redemption_record(
71        &self,
72        params: GetLockedRedemptionRecordParams,
73    ) -> anyhow::Result<RestApiResponse<models::GetLockedRedemptionRecordResponse>>;
74    async fn get_locked_rewards_history(
75        &self,
76        params: GetLockedRewardsHistoryParams,
77    ) -> anyhow::Result<RestApiResponse<models::GetLockedRewardsHistoryResponse>>;
78    async fn get_locked_subscription_preview(
79        &self,
80        params: GetLockedSubscriptionPreviewParams,
81    ) -> anyhow::Result<RestApiResponse<Vec<models::GetLockedSubscriptionPreviewResponseInner>>>;
82    async fn get_locked_subscription_record(
83        &self,
84        params: GetLockedSubscriptionRecordParams,
85    ) -> anyhow::Result<RestApiResponse<models::GetLockedSubscriptionRecordResponse>>;
86    async fn get_rate_history(
87        &self,
88        params: GetRateHistoryParams,
89    ) -> anyhow::Result<RestApiResponse<models::GetRateHistoryResponse>>;
90    async fn get_simple_earn_flexible_product_list(
91        &self,
92        params: GetSimpleEarnFlexibleProductListParams,
93    ) -> anyhow::Result<RestApiResponse<models::GetSimpleEarnFlexibleProductListResponse>>;
94    async fn get_simple_earn_locked_product_list(
95        &self,
96        params: GetSimpleEarnLockedProductListParams,
97    ) -> anyhow::Result<RestApiResponse<models::GetSimpleEarnLockedProductListResponse>>;
98    async fn redeem_flexible_product(
99        &self,
100        params: RedeemFlexibleProductParams,
101    ) -> anyhow::Result<RestApiResponse<models::RedeemFlexibleProductResponse>>;
102    async fn redeem_locked_product(
103        &self,
104        params: RedeemLockedProductParams,
105    ) -> anyhow::Result<RestApiResponse<models::RedeemLockedProductResponse>>;
106    async fn set_flexible_auto_subscribe(
107        &self,
108        params: SetFlexibleAutoSubscribeParams,
109    ) -> anyhow::Result<RestApiResponse<models::SetFlexibleAutoSubscribeResponse>>;
110    async fn set_locked_auto_subscribe(
111        &self,
112        params: SetLockedAutoSubscribeParams,
113    ) -> anyhow::Result<RestApiResponse<models::SetLockedAutoSubscribeResponse>>;
114    async fn set_locked_product_redeem_option(
115        &self,
116        params: SetLockedProductRedeemOptionParams,
117    ) -> anyhow::Result<RestApiResponse<models::SetLockedProductRedeemOptionResponse>>;
118    async fn simple_account(
119        &self,
120        params: SimpleAccountParams,
121    ) -> anyhow::Result<RestApiResponse<models::SimpleAccountResponse>>;
122    async fn subscribe_flexible_product(
123        &self,
124        params: SubscribeFlexibleProductParams,
125    ) -> anyhow::Result<RestApiResponse<models::SubscribeFlexibleProductResponse>>;
126    async fn subscribe_locked_product(
127        &self,
128        params: SubscribeLockedProductParams,
129    ) -> anyhow::Result<RestApiResponse<models::SubscribeLockedProductResponse>>;
130}
131
132#[derive(Debug, Clone)]
133pub struct FlexibleLockedApiClient {
134    configuration: ConfigurationRestApi,
135}
136
137impl FlexibleLockedApiClient {
138    pub fn new(configuration: ConfigurationRestApi) -> Self {
139        Self { configuration }
140    }
141}
142
143#[allow(non_camel_case_types)]
144#[derive(Debug, Clone, Serialize, Deserialize)]
145pub enum GetFlexibleRewardsHistoryTypeEnum {
146    #[serde(rename = "BONUS")]
147    Bonus,
148    #[serde(rename = "REALTIME")]
149    Realtime,
150    #[serde(rename = "REWARDS")]
151    Rewards,
152    #[serde(rename = "ALL")]
153    All,
154}
155
156impl GetFlexibleRewardsHistoryTypeEnum {
157    #[must_use]
158    pub fn as_str(&self) -> &'static str {
159        match self {
160            Self::Bonus => "BONUS",
161            Self::Realtime => "REALTIME",
162            Self::Rewards => "REWARDS",
163            Self::All => "ALL",
164        }
165    }
166}
167
168impl std::str::FromStr for GetFlexibleRewardsHistoryTypeEnum {
169    type Err = Box<dyn std::error::Error + Send + Sync>;
170
171    fn from_str(s: &str) -> Result<Self, Self::Err> {
172        match s {
173            "BONUS" => Ok(Self::Bonus),
174            "REALTIME" => Ok(Self::Realtime),
175            "REWARDS" => Ok(Self::Rewards),
176            "ALL" => Ok(Self::All),
177            other => Err(format!("invalid GetFlexibleRewardsHistoryTypeEnum: {}", other).into()),
178        }
179    }
180}
181
182#[allow(non_camel_case_types)]
183#[derive(Debug, Clone, Serialize, Deserialize)]
184pub enum GetRateHistoryAprPeriodEnum {
185    #[serde(rename = "DAY")]
186    Day,
187    #[serde(rename = "YEAR")]
188    Year,
189}
190
191impl GetRateHistoryAprPeriodEnum {
192    #[must_use]
193    pub fn as_str(&self) -> &'static str {
194        match self {
195            Self::Day => "DAY",
196            Self::Year => "YEAR",
197        }
198    }
199}
200
201impl std::str::FromStr for GetRateHistoryAprPeriodEnum {
202    type Err = Box<dyn std::error::Error + Send + Sync>;
203
204    fn from_str(s: &str) -> Result<Self, Self::Err> {
205        match s {
206            "DAY" => Ok(Self::Day),
207            "YEAR" => Ok(Self::Year),
208            other => Err(format!("invalid GetRateHistoryAprPeriodEnum: {}", other).into()),
209        }
210    }
211}
212
213#[allow(non_camel_case_types)]
214#[derive(Debug, Clone, Serialize, Deserialize)]
215pub enum RedeemFlexibleProductDestAccountEnum {
216    #[serde(rename = "SPOT")]
217    Spot,
218    #[serde(rename = "FUND")]
219    Fund,
220}
221
222impl RedeemFlexibleProductDestAccountEnum {
223    #[must_use]
224    pub fn as_str(&self) -> &'static str {
225        match self {
226            Self::Spot => "SPOT",
227            Self::Fund => "FUND",
228        }
229    }
230}
231
232impl std::str::FromStr for RedeemFlexibleProductDestAccountEnum {
233    type Err = Box<dyn std::error::Error + Send + Sync>;
234
235    fn from_str(s: &str) -> Result<Self, Self::Err> {
236        match s {
237            "SPOT" => Ok(Self::Spot),
238            "FUND" => Ok(Self::Fund),
239            other => Err(format!("invalid RedeemFlexibleProductDestAccountEnum: {}", other).into()),
240        }
241    }
242}
243
244#[allow(non_camel_case_types)]
245#[derive(Debug, Clone, Serialize, Deserialize)]
246pub enum SetLockedProductRedeemOptionRedeemToEnum {
247    #[serde(rename = "SPOT")]
248    Spot,
249    #[serde(rename = "FLEXIBLE")]
250    Flexible,
251}
252
253impl SetLockedProductRedeemOptionRedeemToEnum {
254    #[must_use]
255    pub fn as_str(&self) -> &'static str {
256        match self {
257            Self::Spot => "SPOT",
258            Self::Flexible => "FLEXIBLE",
259        }
260    }
261}
262
263impl std::str::FromStr for SetLockedProductRedeemOptionRedeemToEnum {
264    type Err = Box<dyn std::error::Error + Send + Sync>;
265
266    fn from_str(s: &str) -> Result<Self, Self::Err> {
267        match s {
268            "SPOT" => Ok(Self::Spot),
269            "FLEXIBLE" => Ok(Self::Flexible),
270            other => Err(format!(
271                "invalid SetLockedProductRedeemOptionRedeemToEnum: {}",
272                other
273            )
274            .into()),
275        }
276    }
277}
278
279#[allow(non_camel_case_types)]
280#[derive(Debug, Clone, Serialize, Deserialize)]
281pub enum SubscribeFlexibleProductSourceAccountEnum {
282    #[serde(rename = "SPOT")]
283    Spot,
284    #[serde(rename = "FUND")]
285    Fund,
286    #[serde(rename = "ALL")]
287    All,
288}
289
290impl SubscribeFlexibleProductSourceAccountEnum {
291    #[must_use]
292    pub fn as_str(&self) -> &'static str {
293        match self {
294            Self::Spot => "SPOT",
295            Self::Fund => "FUND",
296            Self::All => "ALL",
297        }
298    }
299}
300
301impl std::str::FromStr for SubscribeFlexibleProductSourceAccountEnum {
302    type Err = Box<dyn std::error::Error + Send + Sync>;
303
304    fn from_str(s: &str) -> Result<Self, Self::Err> {
305        match s {
306            "SPOT" => Ok(Self::Spot),
307            "FUND" => Ok(Self::Fund),
308            "ALL" => Ok(Self::All),
309            other => Err(format!(
310                "invalid SubscribeFlexibleProductSourceAccountEnum: {}",
311                other
312            )
313            .into()),
314        }
315    }
316}
317
318#[allow(non_camel_case_types)]
319#[derive(Debug, Clone, Serialize, Deserialize)]
320pub enum SubscribeLockedProductSourceAccountEnum {
321    #[serde(rename = "SPOT")]
322    Spot,
323    #[serde(rename = "FUND")]
324    Fund,
325    #[serde(rename = "ALL")]
326    All,
327}
328
329impl SubscribeLockedProductSourceAccountEnum {
330    #[must_use]
331    pub fn as_str(&self) -> &'static str {
332        match self {
333            Self::Spot => "SPOT",
334            Self::Fund => "FUND",
335            Self::All => "ALL",
336        }
337    }
338}
339
340impl std::str::FromStr for SubscribeLockedProductSourceAccountEnum {
341    type Err = Box<dyn std::error::Error + Send + Sync>;
342
343    fn from_str(s: &str) -> Result<Self, Self::Err> {
344        match s {
345            "SPOT" => Ok(Self::Spot),
346            "FUND" => Ok(Self::Fund),
347            "ALL" => Ok(Self::All),
348            other => {
349                Err(format!("invalid SubscribeLockedProductSourceAccountEnum: {}", other).into())
350            }
351        }
352    }
353}
354
355#[allow(non_camel_case_types)]
356#[derive(Debug, Clone, Serialize, Deserialize)]
357pub enum SubscribeLockedProductRedeemToEnum {
358    #[serde(rename = "SPOT")]
359    Spot,
360    #[serde(rename = "FLEXIBLE")]
361    Flexible,
362}
363
364impl SubscribeLockedProductRedeemToEnum {
365    #[must_use]
366    pub fn as_str(&self) -> &'static str {
367        match self {
368            Self::Spot => "SPOT",
369            Self::Flexible => "FLEXIBLE",
370        }
371    }
372}
373
374impl std::str::FromStr for SubscribeLockedProductRedeemToEnum {
375    type Err = Box<dyn std::error::Error + Send + Sync>;
376
377    fn from_str(s: &str) -> Result<Self, Self::Err> {
378        match s {
379            "SPOT" => Ok(Self::Spot),
380            "FLEXIBLE" => Ok(Self::Flexible),
381            other => Err(format!("invalid SubscribeLockedProductRedeemToEnum: {}", other).into()),
382        }
383    }
384}
385
386/// Request parameters for the [`get_collateral_record`] operation.
387///
388/// This struct holds all of the inputs you can pass when calling
389/// [`get_collateral_record`](#method.get_collateral_record).
390#[derive(Clone, Debug, Builder, Deserialize, Default)]
391#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
392pub struct GetCollateralRecordParams {
393    ///
394    /// The `product_id` parameter.
395    ///
396    /// This field is **optional.
397    #[builder(setter(into), default)]
398    #[serde(rename = "productId", default)]
399    pub product_id: Option<String>,
400    ///
401    /// The `start_time` parameter.
402    ///
403    /// This field is **optional.
404    #[builder(setter(into), default)]
405    #[serde(rename = "startTime", default)]
406    pub start_time: Option<i64>,
407    ///
408    /// The `end_time` parameter.
409    ///
410    /// This field is **optional.
411    #[builder(setter(into), default)]
412    #[serde(rename = "endTime", default)]
413    pub end_time: Option<i64>,
414    /// Currently querying page.
415    ///
416    /// This field is **optional.
417    #[builder(setter(into), default)]
418    #[serde(rename = "current", default)]
419    pub current: Option<i64>,
420    /// Number of results per page.
421    ///
422    /// This field is **optional.
423    #[builder(setter(into), default)]
424    #[serde(rename = "size", default)]
425    pub size: Option<i64>,
426    /// The value cannot be greater than 60000 (ms)
427    ///
428    /// This field is **optional.
429    #[builder(setter(into), default)]
430    #[serde(rename = "recvWindow", default)]
431    pub recv_window: Option<i64>,
432}
433
434impl GetCollateralRecordParams {
435    /// Create a builder for [`get_collateral_record`].
436    ///
437    #[must_use]
438    pub fn builder() -> GetCollateralRecordParamsBuilder {
439        GetCollateralRecordParamsBuilder::default()
440    }
441}
442/// Request parameters for the [`get_flexible_personal_left_quota`] operation.
443///
444/// This struct holds all of the inputs you can pass when calling
445/// [`get_flexible_personal_left_quota`](#method.get_flexible_personal_left_quota).
446#[derive(Clone, Debug, Builder, Deserialize)]
447#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
448pub struct GetFlexiblePersonalLeftQuotaParams {
449    ///
450    /// The `product_id` parameter.
451    ///
452    /// This field is **required.
453    #[builder(setter(into))]
454    #[serde(rename = "productId")]
455    pub product_id: String,
456    /// The value cannot be greater than 60000 (ms)
457    ///
458    /// This field is **optional.
459    #[builder(setter(into), default)]
460    #[serde(rename = "recvWindow", default)]
461    pub recv_window: Option<i64>,
462}
463
464impl GetFlexiblePersonalLeftQuotaParams {
465    /// Create a builder for [`get_flexible_personal_left_quota`].
466    ///
467    /// Required parameters:
468    ///
469    /// * `product_id` — String
470    ///
471    #[must_use]
472    pub fn builder(product_id: String) -> GetFlexiblePersonalLeftQuotaParamsBuilder {
473        GetFlexiblePersonalLeftQuotaParamsBuilder::default().product_id(product_id)
474    }
475}
476/// Request parameters for the [`get_flexible_product_position`] operation.
477///
478/// This struct holds all of the inputs you can pass when calling
479/// [`get_flexible_product_position`](#method.get_flexible_product_position).
480#[derive(Clone, Debug, Builder, Deserialize, Default)]
481#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
482pub struct GetFlexibleProductPositionParams {
483    ///
484    /// The `asset` parameter.
485    ///
486    /// This field is **optional.
487    #[builder(setter(into), default)]
488    #[serde(rename = "asset", default)]
489    pub asset: Option<String>,
490    ///
491    /// The `product_id` parameter.
492    ///
493    /// This field is **optional.
494    #[builder(setter(into), default)]
495    #[serde(rename = "productId", default)]
496    pub product_id: Option<String>,
497    /// Currently querying page. Starts from 1.
498    ///
499    /// This field is **optional.
500    #[builder(setter(into), default)]
501    #[serde(rename = "current", default)]
502    pub current: Option<i64>,
503    /// Number of results per page.
504    ///
505    /// This field is **optional.
506    #[builder(setter(into), default)]
507    #[serde(rename = "size", default)]
508    pub size: Option<i64>,
509    /// The value cannot be greater than 60000 (ms)
510    ///
511    /// This field is **optional.
512    #[builder(setter(into), default)]
513    #[serde(rename = "recvWindow", default)]
514    pub recv_window: Option<i64>,
515}
516
517impl GetFlexibleProductPositionParams {
518    /// Create a builder for [`get_flexible_product_position`].
519    ///
520    #[must_use]
521    pub fn builder() -> GetFlexibleProductPositionParamsBuilder {
522        GetFlexibleProductPositionParamsBuilder::default()
523    }
524}
525/// Request parameters for the [`get_flexible_redemption_record`] operation.
526///
527/// This struct holds all of the inputs you can pass when calling
528/// [`get_flexible_redemption_record`](#method.get_flexible_redemption_record).
529#[derive(Clone, Debug, Builder, Deserialize, Default)]
530#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
531pub struct GetFlexibleRedemptionRecordParams {
532    ///
533    /// The `product_id` parameter.
534    ///
535    /// This field is **optional.
536    #[builder(setter(into), default)]
537    #[serde(rename = "productId", default)]
538    pub product_id: Option<String>,
539    ///
540    /// The `redeem_id` parameter.
541    ///
542    /// This field is **optional.
543    #[builder(setter(into), default)]
544    #[serde(rename = "redeemId", default)]
545    pub redeem_id: Option<String>,
546    ///
547    /// The `asset` parameter.
548    ///
549    /// This field is **optional.
550    #[builder(setter(into), default)]
551    #[serde(rename = "asset", default)]
552    pub asset: Option<String>,
553    ///
554    /// The `start_time` parameter.
555    ///
556    /// This field is **optional.
557    #[builder(setter(into), default)]
558    #[serde(rename = "startTime", default)]
559    pub start_time: Option<i64>,
560    ///
561    /// The `end_time` parameter.
562    ///
563    /// This field is **optional.
564    #[builder(setter(into), default)]
565    #[serde(rename = "endTime", default)]
566    pub end_time: Option<i64>,
567    /// Currently querying page. Starts from 1.
568    ///
569    /// This field is **optional.
570    #[builder(setter(into), default)]
571    #[serde(rename = "current", default)]
572    pub current: Option<i64>,
573    /// Number of results per page.
574    ///
575    /// This field is **optional.
576    #[builder(setter(into), default)]
577    #[serde(rename = "size", default)]
578    pub size: Option<i64>,
579    /// The value cannot be greater than 60000 (ms)
580    ///
581    /// This field is **optional.
582    #[builder(setter(into), default)]
583    #[serde(rename = "recvWindow", default)]
584    pub recv_window: Option<i64>,
585}
586
587impl GetFlexibleRedemptionRecordParams {
588    /// Create a builder for [`get_flexible_redemption_record`].
589    ///
590    #[must_use]
591    pub fn builder() -> GetFlexibleRedemptionRecordParamsBuilder {
592        GetFlexibleRedemptionRecordParamsBuilder::default()
593    }
594}
595/// Request parameters for the [`get_flexible_rewards_history`] operation.
596///
597/// This struct holds all of the inputs you can pass when calling
598/// [`get_flexible_rewards_history`](#method.get_flexible_rewards_history).
599#[derive(Clone, Debug, Builder, Deserialize, Default)]
600#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
601pub struct GetFlexibleRewardsHistoryParams {
602    ///
603    /// The `product_id` parameter.
604    ///
605    /// This field is **optional.
606    #[builder(setter(into), default)]
607    #[serde(rename = "productId", default)]
608    pub product_id: Option<String>,
609    ///
610    /// The `asset` parameter.
611    ///
612    /// This field is **optional.
613    #[builder(setter(into), default)]
614    #[serde(rename = "asset", default)]
615    pub asset: Option<String>,
616    ///
617    /// The `start_time` parameter.
618    ///
619    /// This field is **optional.
620    #[builder(setter(into), default)]
621    #[serde(rename = "startTime", default)]
622    pub start_time: Option<i64>,
623    ///
624    /// The `end_time` parameter.
625    ///
626    /// This field is **optional.
627    #[builder(setter(into), default)]
628    #[serde(rename = "endTime", default)]
629    pub end_time: Option<i64>,
630    /// `BONUS` - Bonus tiered APR, `REALTIME` - Real-time APR, `REWARDS` - Historical rewards, `ALL` - All types. Default: `ALL`
631    ///
632    /// This field is **optional.
633    #[builder(setter(into), default)]
634    #[serde(rename = "type", default)]
635    pub r#type: Option<GetFlexibleRewardsHistoryTypeEnum>,
636    /// Currently querying page. Starts from 1.
637    ///
638    /// This field is **optional.
639    #[builder(setter(into), default)]
640    #[serde(rename = "current", default)]
641    pub current: Option<i64>,
642    /// Number of results per page.
643    ///
644    /// This field is **optional.
645    #[builder(setter(into), default)]
646    #[serde(rename = "size", default)]
647    pub size: Option<i64>,
648    /// The value cannot be greater than 60000 (ms)
649    ///
650    /// This field is **optional.
651    #[builder(setter(into), default)]
652    #[serde(rename = "recvWindow", default)]
653    pub recv_window: Option<i64>,
654}
655
656impl GetFlexibleRewardsHistoryParams {
657    /// Create a builder for [`get_flexible_rewards_history`].
658    ///
659    #[must_use]
660    pub fn builder() -> GetFlexibleRewardsHistoryParamsBuilder {
661        GetFlexibleRewardsHistoryParamsBuilder::default()
662    }
663}
664/// Request parameters for the [`get_flexible_subscription_preview`] operation.
665///
666/// This struct holds all of the inputs you can pass when calling
667/// [`get_flexible_subscription_preview`](#method.get_flexible_subscription_preview).
668#[derive(Clone, Debug, Builder, Deserialize)]
669#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
670pub struct GetFlexibleSubscriptionPreviewParams {
671    ///
672    /// The `product_id` parameter.
673    ///
674    /// This field is **required.
675    #[builder(setter(into))]
676    #[serde(rename = "productId")]
677    pub product_id: String,
678    ///
679    /// The `amount` parameter.
680    ///
681    /// This field is **required.
682    #[builder(setter(into))]
683    #[serde(rename = "amount")]
684    pub amount: rust_decimal::Decimal,
685    /// The value cannot be greater than 60000 (ms)
686    ///
687    /// This field is **optional.
688    #[builder(setter(into), default)]
689    #[serde(rename = "recvWindow", default)]
690    pub recv_window: Option<i64>,
691}
692
693impl GetFlexibleSubscriptionPreviewParams {
694    /// Create a builder for [`get_flexible_subscription_preview`].
695    ///
696    /// Required parameters:
697    ///
698    /// * `product_id` — String
699    /// * `amount` — `rust_decimal::Decimal`
700    ///
701    #[must_use]
702    pub fn builder(
703        product_id: String,
704        amount: rust_decimal::Decimal,
705    ) -> GetFlexibleSubscriptionPreviewParamsBuilder {
706        GetFlexibleSubscriptionPreviewParamsBuilder::default()
707            .product_id(product_id)
708            .amount(amount)
709    }
710}
711/// Request parameters for the [`get_flexible_subscription_record`] operation.
712///
713/// This struct holds all of the inputs you can pass when calling
714/// [`get_flexible_subscription_record`](#method.get_flexible_subscription_record).
715#[derive(Clone, Debug, Builder, Deserialize, Default)]
716#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
717pub struct GetFlexibleSubscriptionRecordParams {
718    ///
719    /// The `product_id` parameter.
720    ///
721    /// This field is **optional.
722    #[builder(setter(into), default)]
723    #[serde(rename = "productId", default)]
724    pub product_id: Option<String>,
725    ///
726    /// The `purchase_id` parameter.
727    ///
728    /// This field is **optional.
729    #[builder(setter(into), default)]
730    #[serde(rename = "purchaseId", default)]
731    pub purchase_id: Option<String>,
732    ///
733    /// The `asset` parameter.
734    ///
735    /// This field is **optional.
736    #[builder(setter(into), default)]
737    #[serde(rename = "asset", default)]
738    pub asset: Option<String>,
739    ///
740    /// The `start_time` parameter.
741    ///
742    /// This field is **optional.
743    #[builder(setter(into), default)]
744    #[serde(rename = "startTime", default)]
745    pub start_time: Option<i64>,
746    ///
747    /// The `end_time` parameter.
748    ///
749    /// This field is **optional.
750    #[builder(setter(into), default)]
751    #[serde(rename = "endTime", default)]
752    pub end_time: Option<i64>,
753    /// Currently querying page. Starts from 1.
754    ///
755    /// This field is **optional.
756    #[builder(setter(into), default)]
757    #[serde(rename = "current", default)]
758    pub current: Option<i64>,
759    /// Number of results per page.
760    ///
761    /// This field is **optional.
762    #[builder(setter(into), default)]
763    #[serde(rename = "size", default)]
764    pub size: Option<i64>,
765    /// The value cannot be greater than 60000 (ms)
766    ///
767    /// This field is **optional.
768    #[builder(setter(into), default)]
769    #[serde(rename = "recvWindow", default)]
770    pub recv_window: Option<i64>,
771}
772
773impl GetFlexibleSubscriptionRecordParams {
774    /// Create a builder for [`get_flexible_subscription_record`].
775    ///
776    #[must_use]
777    pub fn builder() -> GetFlexibleSubscriptionRecordParamsBuilder {
778        GetFlexibleSubscriptionRecordParamsBuilder::default()
779    }
780}
781/// Request parameters for the [`get_locked_personal_left_quota`] operation.
782///
783/// This struct holds all of the inputs you can pass when calling
784/// [`get_locked_personal_left_quota`](#method.get_locked_personal_left_quota).
785#[derive(Clone, Debug, Builder, Deserialize)]
786#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
787pub struct GetLockedPersonalLeftQuotaParams {
788    ///
789    /// The `project_id` parameter.
790    ///
791    /// This field is **required.
792    #[builder(setter(into))]
793    #[serde(rename = "projectId")]
794    pub project_id: String,
795    /// The value cannot be greater than 60000 (ms)
796    ///
797    /// This field is **optional.
798    #[builder(setter(into), default)]
799    #[serde(rename = "recvWindow", default)]
800    pub recv_window: Option<i64>,
801}
802
803impl GetLockedPersonalLeftQuotaParams {
804    /// Create a builder for [`get_locked_personal_left_quota`].
805    ///
806    /// Required parameters:
807    ///
808    /// * `project_id` — String
809    ///
810    #[must_use]
811    pub fn builder(project_id: String) -> GetLockedPersonalLeftQuotaParamsBuilder {
812        GetLockedPersonalLeftQuotaParamsBuilder::default().project_id(project_id)
813    }
814}
815/// Request parameters for the [`get_locked_product_position`] operation.
816///
817/// This struct holds all of the inputs you can pass when calling
818/// [`get_locked_product_position`](#method.get_locked_product_position).
819#[derive(Clone, Debug, Builder, Deserialize, Default)]
820#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
821pub struct GetLockedProductPositionParams {
822    ///
823    /// The `asset` parameter.
824    ///
825    /// This field is **optional.
826    #[builder(setter(into), default)]
827    #[serde(rename = "asset", default)]
828    pub asset: Option<String>,
829    ///
830    /// The `position_id` parameter.
831    ///
832    /// This field is **optional.
833    #[builder(setter(into), default)]
834    #[serde(rename = "positionId", default)]
835    pub position_id: Option<String>,
836    ///
837    /// The `project_id` parameter.
838    ///
839    /// This field is **optional.
840    #[builder(setter(into), default)]
841    #[serde(rename = "projectId", default)]
842    pub project_id: Option<String>,
843    /// Currently querying page. Starts from 1.
844    ///
845    /// This field is **optional.
846    #[builder(setter(into), default)]
847    #[serde(rename = "current", default)]
848    pub current: Option<i64>,
849    /// Number of results per page.
850    ///
851    /// This field is **optional.
852    #[builder(setter(into), default)]
853    #[serde(rename = "size", default)]
854    pub size: Option<i64>,
855    /// The value cannot be greater than 60000 (ms)
856    ///
857    /// This field is **optional.
858    #[builder(setter(into), default)]
859    #[serde(rename = "recvWindow", default)]
860    pub recv_window: Option<i64>,
861}
862
863impl GetLockedProductPositionParams {
864    /// Create a builder for [`get_locked_product_position`].
865    ///
866    #[must_use]
867    pub fn builder() -> GetLockedProductPositionParamsBuilder {
868        GetLockedProductPositionParamsBuilder::default()
869    }
870}
871/// Request parameters for the [`get_locked_redemption_record`] operation.
872///
873/// This struct holds all of the inputs you can pass when calling
874/// [`get_locked_redemption_record`](#method.get_locked_redemption_record).
875#[derive(Clone, Debug, Builder, Deserialize, Default)]
876#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
877pub struct GetLockedRedemptionRecordParams {
878    ///
879    /// The `position_id` parameter.
880    ///
881    /// This field is **optional.
882    #[builder(setter(into), default)]
883    #[serde(rename = "positionId", default)]
884    pub position_id: Option<String>,
885    ///
886    /// The `redeem_id` parameter.
887    ///
888    /// This field is **optional.
889    #[builder(setter(into), default)]
890    #[serde(rename = "redeemId", default)]
891    pub redeem_id: Option<String>,
892    ///
893    /// The `asset` parameter.
894    ///
895    /// This field is **optional.
896    #[builder(setter(into), default)]
897    #[serde(rename = "asset", default)]
898    pub asset: Option<String>,
899    ///
900    /// The `start_time` parameter.
901    ///
902    /// This field is **optional.
903    #[builder(setter(into), default)]
904    #[serde(rename = "startTime", default)]
905    pub start_time: Option<i64>,
906    ///
907    /// The `end_time` parameter.
908    ///
909    /// This field is **optional.
910    #[builder(setter(into), default)]
911    #[serde(rename = "endTime", default)]
912    pub end_time: Option<i64>,
913    /// Currently querying page. Starts from 1.
914    ///
915    /// This field is **optional.
916    #[builder(setter(into), default)]
917    #[serde(rename = "current", default)]
918    pub current: Option<i64>,
919    /// Number of results per page.
920    ///
921    /// This field is **optional.
922    #[builder(setter(into), default)]
923    #[serde(rename = "size", default)]
924    pub size: Option<i64>,
925    /// The value cannot be greater than 60000 (ms)
926    ///
927    /// This field is **optional.
928    #[builder(setter(into), default)]
929    #[serde(rename = "recvWindow", default)]
930    pub recv_window: Option<i64>,
931}
932
933impl GetLockedRedemptionRecordParams {
934    /// Create a builder for [`get_locked_redemption_record`].
935    ///
936    #[must_use]
937    pub fn builder() -> GetLockedRedemptionRecordParamsBuilder {
938        GetLockedRedemptionRecordParamsBuilder::default()
939    }
940}
941/// Request parameters for the [`get_locked_rewards_history`] operation.
942///
943/// This struct holds all of the inputs you can pass when calling
944/// [`get_locked_rewards_history`](#method.get_locked_rewards_history).
945#[derive(Clone, Debug, Builder, Deserialize, Default)]
946#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
947pub struct GetLockedRewardsHistoryParams {
948    ///
949    /// The `position_id` parameter.
950    ///
951    /// This field is **optional.
952    #[builder(setter(into), default)]
953    #[serde(rename = "positionId", default)]
954    pub position_id: Option<String>,
955    ///
956    /// The `asset` parameter.
957    ///
958    /// This field is **optional.
959    #[builder(setter(into), default)]
960    #[serde(rename = "asset", default)]
961    pub asset: Option<String>,
962    ///
963    /// The `start_time` parameter.
964    ///
965    /// This field is **optional.
966    #[builder(setter(into), default)]
967    #[serde(rename = "startTime", default)]
968    pub start_time: Option<i64>,
969    ///
970    /// The `end_time` parameter.
971    ///
972    /// This field is **optional.
973    #[builder(setter(into), default)]
974    #[serde(rename = "endTime", default)]
975    pub end_time: Option<i64>,
976    /// Currently querying page. Starts from 1.
977    ///
978    /// This field is **optional.
979    #[builder(setter(into), default)]
980    #[serde(rename = "current", default)]
981    pub current: Option<i64>,
982    /// Number of results per page.
983    ///
984    /// This field is **optional.
985    #[builder(setter(into), default)]
986    #[serde(rename = "size", default)]
987    pub size: Option<i64>,
988    /// The value cannot be greater than 60000 (ms)
989    ///
990    /// This field is **optional.
991    #[builder(setter(into), default)]
992    #[serde(rename = "recvWindow", default)]
993    pub recv_window: Option<i64>,
994}
995
996impl GetLockedRewardsHistoryParams {
997    /// Create a builder for [`get_locked_rewards_history`].
998    ///
999    #[must_use]
1000    pub fn builder() -> GetLockedRewardsHistoryParamsBuilder {
1001        GetLockedRewardsHistoryParamsBuilder::default()
1002    }
1003}
1004/// Request parameters for the [`get_locked_subscription_preview`] operation.
1005///
1006/// This struct holds all of the inputs you can pass when calling
1007/// [`get_locked_subscription_preview`](#method.get_locked_subscription_preview).
1008#[derive(Clone, Debug, Builder, Deserialize)]
1009#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1010pub struct GetLockedSubscriptionPreviewParams {
1011    ///
1012    /// The `project_id` parameter.
1013    ///
1014    /// This field is **required.
1015    #[builder(setter(into))]
1016    #[serde(rename = "projectId")]
1017    pub project_id: String,
1018    ///
1019    /// The `amount` parameter.
1020    ///
1021    /// This field is **required.
1022    #[builder(setter(into))]
1023    #[serde(rename = "amount")]
1024    pub amount: rust_decimal::Decimal,
1025    /// default true.
1026    ///
1027    /// This field is **optional.
1028    #[builder(setter(into), default)]
1029    #[serde(rename = "autoSubscribe", default)]
1030    pub auto_subscribe: Option<bool>,
1031    /// The value cannot be greater than 60000 (ms)
1032    ///
1033    /// This field is **optional.
1034    #[builder(setter(into), default)]
1035    #[serde(rename = "recvWindow", default)]
1036    pub recv_window: Option<i64>,
1037}
1038
1039impl GetLockedSubscriptionPreviewParams {
1040    /// Create a builder for [`get_locked_subscription_preview`].
1041    ///
1042    /// Required parameters:
1043    ///
1044    /// * `project_id` — String
1045    /// * `amount` — `rust_decimal::Decimal`
1046    ///
1047    #[must_use]
1048    pub fn builder(
1049        project_id: String,
1050        amount: rust_decimal::Decimal,
1051    ) -> GetLockedSubscriptionPreviewParamsBuilder {
1052        GetLockedSubscriptionPreviewParamsBuilder::default()
1053            .project_id(project_id)
1054            .amount(amount)
1055    }
1056}
1057/// Request parameters for the [`get_locked_subscription_record`] operation.
1058///
1059/// This struct holds all of the inputs you can pass when calling
1060/// [`get_locked_subscription_record`](#method.get_locked_subscription_record).
1061#[derive(Clone, Debug, Builder, Deserialize, Default)]
1062#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1063pub struct GetLockedSubscriptionRecordParams {
1064    ///
1065    /// The `purchase_id` parameter.
1066    ///
1067    /// This field is **optional.
1068    #[builder(setter(into), default)]
1069    #[serde(rename = "purchaseId", default)]
1070    pub purchase_id: Option<String>,
1071    ///
1072    /// The `asset` parameter.
1073    ///
1074    /// This field is **optional.
1075    #[builder(setter(into), default)]
1076    #[serde(rename = "asset", default)]
1077    pub asset: Option<String>,
1078    ///
1079    /// The `start_time` parameter.
1080    ///
1081    /// This field is **optional.
1082    #[builder(setter(into), default)]
1083    #[serde(rename = "startTime", default)]
1084    pub start_time: Option<i64>,
1085    ///
1086    /// The `end_time` parameter.
1087    ///
1088    /// This field is **optional.
1089    #[builder(setter(into), default)]
1090    #[serde(rename = "endTime", default)]
1091    pub end_time: Option<i64>,
1092    /// Currently querying page. Starts from 1.
1093    ///
1094    /// This field is **optional.
1095    #[builder(setter(into), default)]
1096    #[serde(rename = "current", default)]
1097    pub current: Option<i64>,
1098    /// Number of results per page.
1099    ///
1100    /// This field is **optional.
1101    #[builder(setter(into), default)]
1102    #[serde(rename = "size", default)]
1103    pub size: Option<i64>,
1104    /// The value cannot be greater than 60000 (ms)
1105    ///
1106    /// This field is **optional.
1107    #[builder(setter(into), default)]
1108    #[serde(rename = "recvWindow", default)]
1109    pub recv_window: Option<i64>,
1110}
1111
1112impl GetLockedSubscriptionRecordParams {
1113    /// Create a builder for [`get_locked_subscription_record`].
1114    ///
1115    #[must_use]
1116    pub fn builder() -> GetLockedSubscriptionRecordParamsBuilder {
1117        GetLockedSubscriptionRecordParamsBuilder::default()
1118    }
1119}
1120/// Request parameters for the [`get_rate_history`] operation.
1121///
1122/// This struct holds all of the inputs you can pass when calling
1123/// [`get_rate_history`](#method.get_rate_history).
1124#[derive(Clone, Debug, Builder, Deserialize)]
1125#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1126pub struct GetRateHistoryParams {
1127    ///
1128    /// The `product_id` parameter.
1129    ///
1130    /// This field is **required.
1131    #[builder(setter(into))]
1132    #[serde(rename = "productId")]
1133    pub product_id: String,
1134    ///
1135    /// The `apr_period` parameter.
1136    ///
1137    /// This field is **optional.
1138    #[builder(setter(into), default)]
1139    #[serde(rename = "aprPeriod", default)]
1140    pub apr_period: Option<GetRateHistoryAprPeriodEnum>,
1141    ///
1142    /// The `start_time` parameter.
1143    ///
1144    /// This field is **optional.
1145    #[builder(setter(into), default)]
1146    #[serde(rename = "startTime", default)]
1147    pub start_time: Option<i64>,
1148    ///
1149    /// The `end_time` parameter.
1150    ///
1151    /// This field is **optional.
1152    #[builder(setter(into), default)]
1153    #[serde(rename = "endTime", default)]
1154    pub end_time: Option<i64>,
1155    /// Currently querying page
1156    ///
1157    /// This field is **optional.
1158    #[builder(setter(into), default)]
1159    #[serde(rename = "current", default)]
1160    pub current: Option<i64>,
1161    /// Number of results per page
1162    ///
1163    /// This field is **optional.
1164    #[builder(setter(into), default)]
1165    #[serde(rename = "size", default)]
1166    pub size: Option<i64>,
1167    /// The value cannot be greater than 60000 (ms)
1168    ///
1169    /// This field is **optional.
1170    #[builder(setter(into), default)]
1171    #[serde(rename = "recvWindow", default)]
1172    pub recv_window: Option<i64>,
1173}
1174
1175impl GetRateHistoryParams {
1176    /// Create a builder for [`get_rate_history`].
1177    ///
1178    /// Required parameters:
1179    ///
1180    /// * `product_id` — String
1181    ///
1182    #[must_use]
1183    pub fn builder(product_id: String) -> GetRateHistoryParamsBuilder {
1184        GetRateHistoryParamsBuilder::default().product_id(product_id)
1185    }
1186}
1187/// Request parameters for the [`get_simple_earn_flexible_product_list`] operation.
1188///
1189/// This struct holds all of the inputs you can pass when calling
1190/// [`get_simple_earn_flexible_product_list`](#method.get_simple_earn_flexible_product_list).
1191#[derive(Clone, Debug, Builder, Deserialize, Default)]
1192#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1193pub struct GetSimpleEarnFlexibleProductListParams {
1194    ///
1195    /// The `asset` parameter.
1196    ///
1197    /// This field is **optional.
1198    #[builder(setter(into), default)]
1199    #[serde(rename = "asset", default)]
1200    pub asset: Option<String>,
1201    /// Currently querying page. Starts from 1.
1202    ///
1203    /// This field is **optional.
1204    #[builder(setter(into), default)]
1205    #[serde(rename = "current", default)]
1206    pub current: Option<i64>,
1207    /// Number of results per page.
1208    ///
1209    /// This field is **optional.
1210    #[builder(setter(into), default)]
1211    #[serde(rename = "size", default)]
1212    pub size: Option<i64>,
1213    /// The value cannot be greater than 60000 (ms)
1214    ///
1215    /// This field is **optional.
1216    #[builder(setter(into), default)]
1217    #[serde(rename = "recvWindow", default)]
1218    pub recv_window: Option<i64>,
1219}
1220
1221impl GetSimpleEarnFlexibleProductListParams {
1222    /// Create a builder for [`get_simple_earn_flexible_product_list`].
1223    ///
1224    #[must_use]
1225    pub fn builder() -> GetSimpleEarnFlexibleProductListParamsBuilder {
1226        GetSimpleEarnFlexibleProductListParamsBuilder::default()
1227    }
1228}
1229/// Request parameters for the [`get_simple_earn_locked_product_list`] operation.
1230///
1231/// This struct holds all of the inputs you can pass when calling
1232/// [`get_simple_earn_locked_product_list`](#method.get_simple_earn_locked_product_list).
1233#[derive(Clone, Debug, Builder, Deserialize, Default)]
1234#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1235pub struct GetSimpleEarnLockedProductListParams {
1236    ///
1237    /// The `asset` parameter.
1238    ///
1239    /// This field is **optional.
1240    #[builder(setter(into), default)]
1241    #[serde(rename = "asset", default)]
1242    pub asset: Option<String>,
1243    /// Currently querying page. Starts from 1.
1244    ///
1245    /// This field is **optional.
1246    #[builder(setter(into), default)]
1247    #[serde(rename = "current", default)]
1248    pub current: Option<i64>,
1249    /// Number of results per page.
1250    ///
1251    /// This field is **optional.
1252    #[builder(setter(into), default)]
1253    #[serde(rename = "size", default)]
1254    pub size: Option<i64>,
1255    /// The value cannot be greater than 60000 (ms)
1256    ///
1257    /// This field is **optional.
1258    #[builder(setter(into), default)]
1259    #[serde(rename = "recvWindow", default)]
1260    pub recv_window: Option<i64>,
1261}
1262
1263impl GetSimpleEarnLockedProductListParams {
1264    /// Create a builder for [`get_simple_earn_locked_product_list`].
1265    ///
1266    #[must_use]
1267    pub fn builder() -> GetSimpleEarnLockedProductListParamsBuilder {
1268        GetSimpleEarnLockedProductListParamsBuilder::default()
1269    }
1270}
1271/// Request parameters for the [`redeem_flexible_product`] operation.
1272///
1273/// This struct holds all of the inputs you can pass when calling
1274/// [`redeem_flexible_product`](#method.redeem_flexible_product).
1275#[derive(Clone, Debug, Builder, Deserialize)]
1276#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1277pub struct RedeemFlexibleProductParams {
1278    ///
1279    /// The `product_id` parameter.
1280    ///
1281    /// This field is **required.
1282    #[builder(setter(into))]
1283    #[serde(rename = "productId")]
1284    pub product_id: String,
1285    ///
1286    /// The `redeem_all` parameter.
1287    ///
1288    /// This field is **optional.
1289    #[builder(setter(into), default)]
1290    #[serde(rename = "redeemAll", default)]
1291    pub redeem_all: Option<bool>,
1292    /// if redeemAll is false, amount is mandatory
1293    ///
1294    /// This field is **optional.
1295    #[builder(setter(into), default)]
1296    #[serde(rename = "amount", default)]
1297    pub amount: Option<rust_decimal::Decimal>,
1298    ///
1299    /// The `dest_account` parameter.
1300    ///
1301    /// This field is **optional.
1302    #[builder(setter(into), default)]
1303    #[serde(rename = "destAccount", default)]
1304    pub dest_account: Option<RedeemFlexibleProductDestAccountEnum>,
1305    /// Request validity window in milliseconds.
1306    ///
1307    /// This field is **optional.
1308    #[builder(setter(into), default)]
1309    #[serde(rename = "recvWindow", default)]
1310    pub recv_window: Option<i64>,
1311}
1312
1313impl RedeemFlexibleProductParams {
1314    /// Create a builder for [`redeem_flexible_product`].
1315    ///
1316    /// Required parameters:
1317    ///
1318    /// * `product_id` — String
1319    ///
1320    #[must_use]
1321    pub fn builder(product_id: String) -> RedeemFlexibleProductParamsBuilder {
1322        RedeemFlexibleProductParamsBuilder::default().product_id(product_id)
1323    }
1324}
1325/// Request parameters for the [`redeem_locked_product`] operation.
1326///
1327/// This struct holds all of the inputs you can pass when calling
1328/// [`redeem_locked_product`](#method.redeem_locked_product).
1329#[derive(Clone, Debug, Builder, Deserialize)]
1330#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1331pub struct RedeemLockedProductParams {
1332    /// Locked product position ID
1333    ///
1334    /// This field is **required.
1335    #[builder(setter(into))]
1336    #[serde(rename = "positionId")]
1337    pub position_id: String,
1338    /// Request validity window in milliseconds.
1339    ///
1340    /// This field is **optional.
1341    #[builder(setter(into), default)]
1342    #[serde(rename = "recvWindow", default)]
1343    pub recv_window: Option<i64>,
1344}
1345
1346impl RedeemLockedProductParams {
1347    /// Create a builder for [`redeem_locked_product`].
1348    ///
1349    /// Required parameters:
1350    ///
1351    /// * `position_id` — Locked product position ID
1352    ///
1353    #[must_use]
1354    pub fn builder(position_id: String) -> RedeemLockedProductParamsBuilder {
1355        RedeemLockedProductParamsBuilder::default().position_id(position_id)
1356    }
1357}
1358/// Request parameters for the [`set_flexible_auto_subscribe`] operation.
1359///
1360/// This struct holds all of the inputs you can pass when calling
1361/// [`set_flexible_auto_subscribe`](#method.set_flexible_auto_subscribe).
1362#[derive(Clone, Debug, Builder, Deserialize)]
1363#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1364pub struct SetFlexibleAutoSubscribeParams {
1365    ///
1366    /// The `product_id` parameter.
1367    ///
1368    /// This field is **required.
1369    #[builder(setter(into))]
1370    #[serde(rename = "productId")]
1371    pub product_id: String,
1372    ///
1373    /// The `auto_subscribe` parameter.
1374    ///
1375    /// This field is **required.
1376    #[builder(setter(into))]
1377    #[serde(rename = "autoSubscribe")]
1378    pub auto_subscribe: bool,
1379    /// Request validity window in milliseconds.
1380    ///
1381    /// This field is **optional.
1382    #[builder(setter(into), default)]
1383    #[serde(rename = "recvWindow", default)]
1384    pub recv_window: Option<i64>,
1385}
1386
1387impl SetFlexibleAutoSubscribeParams {
1388    /// Create a builder for [`set_flexible_auto_subscribe`].
1389    ///
1390    /// Required parameters:
1391    ///
1392    /// * `product_id` — String
1393    /// * `auto_subscribe` — bool
1394    ///
1395    #[must_use]
1396    pub fn builder(
1397        product_id: String,
1398        auto_subscribe: bool,
1399    ) -> SetFlexibleAutoSubscribeParamsBuilder {
1400        SetFlexibleAutoSubscribeParamsBuilder::default()
1401            .product_id(product_id)
1402            .auto_subscribe(auto_subscribe)
1403    }
1404}
1405/// Request parameters for the [`set_locked_auto_subscribe`] operation.
1406///
1407/// This struct holds all of the inputs you can pass when calling
1408/// [`set_locked_auto_subscribe`](#method.set_locked_auto_subscribe).
1409#[derive(Clone, Debug, Builder, Deserialize)]
1410#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1411pub struct SetLockedAutoSubscribeParams {
1412    ///
1413    /// The `position_id` parameter.
1414    ///
1415    /// This field is **required.
1416    #[builder(setter(into))]
1417    #[serde(rename = "positionId")]
1418    pub position_id: String,
1419    ///
1420    /// The `auto_subscribe` parameter.
1421    ///
1422    /// This field is **required.
1423    #[builder(setter(into))]
1424    #[serde(rename = "autoSubscribe")]
1425    pub auto_subscribe: bool,
1426    /// Request validity window in milliseconds.
1427    ///
1428    /// This field is **optional.
1429    #[builder(setter(into), default)]
1430    #[serde(rename = "recvWindow", default)]
1431    pub recv_window: Option<i64>,
1432}
1433
1434impl SetLockedAutoSubscribeParams {
1435    /// Create a builder for [`set_locked_auto_subscribe`].
1436    ///
1437    /// Required parameters:
1438    ///
1439    /// * `position_id` — String
1440    /// * `auto_subscribe` — bool
1441    ///
1442    #[must_use]
1443    pub fn builder(
1444        position_id: String,
1445        auto_subscribe: bool,
1446    ) -> SetLockedAutoSubscribeParamsBuilder {
1447        SetLockedAutoSubscribeParamsBuilder::default()
1448            .position_id(position_id)
1449            .auto_subscribe(auto_subscribe)
1450    }
1451}
1452/// Request parameters for the [`set_locked_product_redeem_option`] operation.
1453///
1454/// This struct holds all of the inputs you can pass when calling
1455/// [`set_locked_product_redeem_option`](#method.set_locked_product_redeem_option).
1456#[derive(Clone, Debug, Builder, Deserialize)]
1457#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1458pub struct SetLockedProductRedeemOptionParams {
1459    ///
1460    /// The `position_id` parameter.
1461    ///
1462    /// This field is **required.
1463    #[builder(setter(into))]
1464    #[serde(rename = "positionId")]
1465    pub position_id: String,
1466    ///
1467    /// The `redeem_to` parameter.
1468    ///
1469    /// This field is **required.
1470    #[builder(setter(into))]
1471    #[serde(rename = "redeemTo")]
1472    pub redeem_to: SetLockedProductRedeemOptionRedeemToEnum,
1473    /// Request validity window in milliseconds.
1474    ///
1475    /// This field is **optional.
1476    #[builder(setter(into), default)]
1477    #[serde(rename = "recvWindow", default)]
1478    pub recv_window: Option<i64>,
1479}
1480
1481impl SetLockedProductRedeemOptionParams {
1482    /// Create a builder for [`set_locked_product_redeem_option`].
1483    ///
1484    /// Required parameters:
1485    ///
1486    /// * `position_id` — String
1487    /// * `redeem_to` — String
1488    ///
1489    #[must_use]
1490    pub fn builder(
1491        position_id: String,
1492        redeem_to: SetLockedProductRedeemOptionRedeemToEnum,
1493    ) -> SetLockedProductRedeemOptionParamsBuilder {
1494        SetLockedProductRedeemOptionParamsBuilder::default()
1495            .position_id(position_id)
1496            .redeem_to(redeem_to)
1497    }
1498}
1499/// Request parameters for the [`simple_account`] operation.
1500///
1501/// This struct holds all of the inputs you can pass when calling
1502/// [`simple_account`](#method.simple_account).
1503#[derive(Clone, Debug, Builder, Deserialize, Default)]
1504#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1505pub struct SimpleAccountParams {
1506    /// The value cannot be greater than 60000 (ms)
1507    ///
1508    /// This field is **optional.
1509    #[builder(setter(into), default)]
1510    #[serde(rename = "recvWindow", default)]
1511    pub recv_window: Option<i64>,
1512}
1513
1514impl SimpleAccountParams {
1515    /// Create a builder for [`simple_account`].
1516    ///
1517    #[must_use]
1518    pub fn builder() -> SimpleAccountParamsBuilder {
1519        SimpleAccountParamsBuilder::default()
1520    }
1521}
1522/// Request parameters for the [`subscribe_flexible_product`] operation.
1523///
1524/// This struct holds all of the inputs you can pass when calling
1525/// [`subscribe_flexible_product`](#method.subscribe_flexible_product).
1526#[derive(Clone, Debug, Builder, Deserialize)]
1527#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1528pub struct SubscribeFlexibleProductParams {
1529    ///
1530    /// The `product_id` parameter.
1531    ///
1532    /// This field is **required.
1533    #[builder(setter(into))]
1534    #[serde(rename = "productId")]
1535    pub product_id: String,
1536    ///
1537    /// The `amount` parameter.
1538    ///
1539    /// This field is **required.
1540    #[builder(setter(into))]
1541    #[serde(rename = "amount")]
1542    pub amount: rust_decimal::Decimal,
1543    ///
1544    /// The `auto_subscribe` parameter.
1545    ///
1546    /// This field is **optional.
1547    #[builder(setter(into), default)]
1548    #[serde(rename = "autoSubscribe", default)]
1549    pub auto_subscribe: Option<bool>,
1550    ///
1551    /// The `source_account` parameter.
1552    ///
1553    /// This field is **optional.
1554    #[builder(setter(into), default)]
1555    #[serde(rename = "sourceAccount", default)]
1556    pub source_account: Option<SubscribeFlexibleProductSourceAccountEnum>,
1557    /// Request validity window in milliseconds.
1558    ///
1559    /// This field is **optional.
1560    #[builder(setter(into), default)]
1561    #[serde(rename = "recvWindow", default)]
1562    pub recv_window: Option<i64>,
1563}
1564
1565impl SubscribeFlexibleProductParams {
1566    /// Create a builder for [`subscribe_flexible_product`].
1567    ///
1568    /// Required parameters:
1569    ///
1570    /// * `product_id` — String
1571    /// * `amount` — `rust_decimal::Decimal`
1572    ///
1573    #[must_use]
1574    pub fn builder(
1575        product_id: String,
1576        amount: rust_decimal::Decimal,
1577    ) -> SubscribeFlexibleProductParamsBuilder {
1578        SubscribeFlexibleProductParamsBuilder::default()
1579            .product_id(product_id)
1580            .amount(amount)
1581    }
1582}
1583/// Request parameters for the [`subscribe_locked_product`] operation.
1584///
1585/// This struct holds all of the inputs you can pass when calling
1586/// [`subscribe_locked_product`](#method.subscribe_locked_product).
1587#[derive(Clone, Debug, Builder, Deserialize)]
1588#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1589pub struct SubscribeLockedProductParams {
1590    ///
1591    /// The `project_id` parameter.
1592    ///
1593    /// This field is **required.
1594    #[builder(setter(into))]
1595    #[serde(rename = "projectId")]
1596    pub project_id: String,
1597    ///
1598    /// The `amount` parameter.
1599    ///
1600    /// This field is **required.
1601    #[builder(setter(into))]
1602    #[serde(rename = "amount")]
1603    pub amount: rust_decimal::Decimal,
1604    ///
1605    /// The `auto_subscribe` parameter.
1606    ///
1607    /// This field is **optional.
1608    #[builder(setter(into), default)]
1609    #[serde(rename = "autoSubscribe", default)]
1610    pub auto_subscribe: Option<bool>,
1611    ///
1612    /// The `source_account` parameter.
1613    ///
1614    /// This field is **optional.
1615    #[builder(setter(into), default)]
1616    #[serde(rename = "sourceAccount", default)]
1617    pub source_account: Option<SubscribeLockedProductSourceAccountEnum>,
1618    ///
1619    /// The `redeem_to` parameter.
1620    ///
1621    /// This field is **optional.
1622    #[builder(setter(into), default)]
1623    #[serde(rename = "redeemTo", default)]
1624    pub redeem_to: Option<SubscribeLockedProductRedeemToEnum>,
1625    /// Request validity window in milliseconds.
1626    ///
1627    /// This field is **optional.
1628    #[builder(setter(into), default)]
1629    #[serde(rename = "recvWindow", default)]
1630    pub recv_window: Option<i64>,
1631}
1632
1633impl SubscribeLockedProductParams {
1634    /// Create a builder for [`subscribe_locked_product`].
1635    ///
1636    /// Required parameters:
1637    ///
1638    /// * `project_id` — String
1639    /// * `amount` — `rust_decimal::Decimal`
1640    ///
1641    #[must_use]
1642    pub fn builder(
1643        project_id: String,
1644        amount: rust_decimal::Decimal,
1645    ) -> SubscribeLockedProductParamsBuilder {
1646        SubscribeLockedProductParamsBuilder::default()
1647            .project_id(project_id)
1648            .amount(amount)
1649    }
1650}
1651
1652#[async_trait]
1653impl FlexibleLockedApi for FlexibleLockedApiClient {
1654    async fn get_collateral_record(
1655        &self,
1656        params: GetCollateralRecordParams,
1657    ) -> anyhow::Result<RestApiResponse<models::GetCollateralRecordResponse>> {
1658        let GetCollateralRecordParams {
1659            product_id,
1660            start_time,
1661            end_time,
1662            current,
1663            size,
1664            recv_window,
1665        } = params;
1666
1667        let mut query_params = BTreeMap::new();
1668        let body_params = BTreeMap::new();
1669
1670        if let Some(rw) = product_id {
1671            query_params.insert("productId".to_string(), json!(rw));
1672        }
1673
1674        if let Some(rw) = start_time {
1675            query_params.insert("startTime".to_string(), json!(rw));
1676        }
1677
1678        if let Some(rw) = end_time {
1679            query_params.insert("endTime".to_string(), json!(rw));
1680        }
1681
1682        if let Some(rw) = current {
1683            query_params.insert("current".to_string(), json!(rw));
1684        }
1685
1686        if let Some(rw) = size {
1687            query_params.insert("size".to_string(), json!(rw));
1688        }
1689
1690        if let Some(rw) = recv_window {
1691            query_params.insert("recvWindow".to_string(), json!(rw));
1692        }
1693
1694        send_request::<models::GetCollateralRecordResponse>(
1695            &self.configuration,
1696            "/sapi/v1/simple-earn/flexible/history/collateralRecord",
1697            reqwest::Method::GET,
1698            query_params,
1699            body_params,
1700            if HAS_TIME_UNIT {
1701                self.configuration.time_unit
1702            } else {
1703                None
1704            },
1705            true,
1706        )
1707        .await
1708    }
1709
1710    async fn get_flexible_personal_left_quota(
1711        &self,
1712        params: GetFlexiblePersonalLeftQuotaParams,
1713    ) -> anyhow::Result<RestApiResponse<models::GetFlexiblePersonalLeftQuotaResponse>> {
1714        let GetFlexiblePersonalLeftQuotaParams {
1715            product_id,
1716            recv_window,
1717        } = params;
1718
1719        let mut query_params = BTreeMap::new();
1720        let body_params = BTreeMap::new();
1721
1722        query_params.insert("productId".to_string(), json!(product_id));
1723
1724        if let Some(rw) = recv_window {
1725            query_params.insert("recvWindow".to_string(), json!(rw));
1726        }
1727
1728        send_request::<models::GetFlexiblePersonalLeftQuotaResponse>(
1729            &self.configuration,
1730            "/sapi/v1/simple-earn/flexible/personalLeftQuota",
1731            reqwest::Method::GET,
1732            query_params,
1733            body_params,
1734            if HAS_TIME_UNIT {
1735                self.configuration.time_unit
1736            } else {
1737                None
1738            },
1739            true,
1740        )
1741        .await
1742    }
1743
1744    async fn get_flexible_product_position(
1745        &self,
1746        params: GetFlexibleProductPositionParams,
1747    ) -> anyhow::Result<RestApiResponse<models::GetFlexibleProductPositionResponse>> {
1748        let GetFlexibleProductPositionParams {
1749            asset,
1750            product_id,
1751            current,
1752            size,
1753            recv_window,
1754        } = params;
1755
1756        let mut query_params = BTreeMap::new();
1757        let body_params = BTreeMap::new();
1758
1759        if let Some(rw) = asset {
1760            query_params.insert("asset".to_string(), json!(rw));
1761        }
1762
1763        if let Some(rw) = product_id {
1764            query_params.insert("productId".to_string(), json!(rw));
1765        }
1766
1767        if let Some(rw) = current {
1768            query_params.insert("current".to_string(), json!(rw));
1769        }
1770
1771        if let Some(rw) = size {
1772            query_params.insert("size".to_string(), json!(rw));
1773        }
1774
1775        if let Some(rw) = recv_window {
1776            query_params.insert("recvWindow".to_string(), json!(rw));
1777        }
1778
1779        send_request::<models::GetFlexibleProductPositionResponse>(
1780            &self.configuration,
1781            "/sapi/v1/simple-earn/flexible/position",
1782            reqwest::Method::GET,
1783            query_params,
1784            body_params,
1785            if HAS_TIME_UNIT {
1786                self.configuration.time_unit
1787            } else {
1788                None
1789            },
1790            true,
1791        )
1792        .await
1793    }
1794
1795    async fn get_flexible_redemption_record(
1796        &self,
1797        params: GetFlexibleRedemptionRecordParams,
1798    ) -> anyhow::Result<RestApiResponse<models::GetFlexibleRedemptionRecordResponse>> {
1799        let GetFlexibleRedemptionRecordParams {
1800            product_id,
1801            redeem_id,
1802            asset,
1803            start_time,
1804            end_time,
1805            current,
1806            size,
1807            recv_window,
1808        } = params;
1809
1810        let mut query_params = BTreeMap::new();
1811        let body_params = BTreeMap::new();
1812
1813        if let Some(rw) = product_id {
1814            query_params.insert("productId".to_string(), json!(rw));
1815        }
1816
1817        if let Some(rw) = redeem_id {
1818            query_params.insert("redeemId".to_string(), json!(rw));
1819        }
1820
1821        if let Some(rw) = asset {
1822            query_params.insert("asset".to_string(), json!(rw));
1823        }
1824
1825        if let Some(rw) = start_time {
1826            query_params.insert("startTime".to_string(), json!(rw));
1827        }
1828
1829        if let Some(rw) = end_time {
1830            query_params.insert("endTime".to_string(), json!(rw));
1831        }
1832
1833        if let Some(rw) = current {
1834            query_params.insert("current".to_string(), json!(rw));
1835        }
1836
1837        if let Some(rw) = size {
1838            query_params.insert("size".to_string(), json!(rw));
1839        }
1840
1841        if let Some(rw) = recv_window {
1842            query_params.insert("recvWindow".to_string(), json!(rw));
1843        }
1844
1845        send_request::<models::GetFlexibleRedemptionRecordResponse>(
1846            &self.configuration,
1847            "/sapi/v1/simple-earn/flexible/history/redemptionRecord",
1848            reqwest::Method::GET,
1849            query_params,
1850            body_params,
1851            if HAS_TIME_UNIT {
1852                self.configuration.time_unit
1853            } else {
1854                None
1855            },
1856            true,
1857        )
1858        .await
1859    }
1860
1861    async fn get_flexible_rewards_history(
1862        &self,
1863        params: GetFlexibleRewardsHistoryParams,
1864    ) -> anyhow::Result<RestApiResponse<models::GetFlexibleRewardsHistoryResponse>> {
1865        let GetFlexibleRewardsHistoryParams {
1866            product_id,
1867            asset,
1868            start_time,
1869            end_time,
1870            r#type,
1871            current,
1872            size,
1873            recv_window,
1874        } = params;
1875
1876        let mut query_params = BTreeMap::new();
1877        let body_params = BTreeMap::new();
1878
1879        if let Some(rw) = product_id {
1880            query_params.insert("productId".to_string(), json!(rw));
1881        }
1882
1883        if let Some(rw) = asset {
1884            query_params.insert("asset".to_string(), json!(rw));
1885        }
1886
1887        if let Some(rw) = start_time {
1888            query_params.insert("startTime".to_string(), json!(rw));
1889        }
1890
1891        if let Some(rw) = end_time {
1892            query_params.insert("endTime".to_string(), json!(rw));
1893        }
1894
1895        if let Some(rw) = r#type {
1896            query_params.insert("type".to_string(), json!(rw));
1897        }
1898
1899        if let Some(rw) = current {
1900            query_params.insert("current".to_string(), json!(rw));
1901        }
1902
1903        if let Some(rw) = size {
1904            query_params.insert("size".to_string(), json!(rw));
1905        }
1906
1907        if let Some(rw) = recv_window {
1908            query_params.insert("recvWindow".to_string(), json!(rw));
1909        }
1910
1911        send_request::<models::GetFlexibleRewardsHistoryResponse>(
1912            &self.configuration,
1913            "/sapi/v1/simple-earn/flexible/history/rewardsRecord",
1914            reqwest::Method::GET,
1915            query_params,
1916            body_params,
1917            if HAS_TIME_UNIT {
1918                self.configuration.time_unit
1919            } else {
1920                None
1921            },
1922            true,
1923        )
1924        .await
1925    }
1926
1927    async fn get_flexible_subscription_preview(
1928        &self,
1929        params: GetFlexibleSubscriptionPreviewParams,
1930    ) -> anyhow::Result<RestApiResponse<models::GetFlexibleSubscriptionPreviewResponse>> {
1931        let GetFlexibleSubscriptionPreviewParams {
1932            product_id,
1933            amount,
1934            recv_window,
1935        } = params;
1936
1937        let mut query_params = BTreeMap::new();
1938        let body_params = BTreeMap::new();
1939
1940        query_params.insert("productId".to_string(), json!(product_id));
1941
1942        query_params.insert("amount".to_string(), json!(amount));
1943
1944        if let Some(rw) = recv_window {
1945            query_params.insert("recvWindow".to_string(), json!(rw));
1946        }
1947
1948        send_request::<models::GetFlexibleSubscriptionPreviewResponse>(
1949            &self.configuration,
1950            "/sapi/v1/simple-earn/flexible/subscriptionPreview",
1951            reqwest::Method::GET,
1952            query_params,
1953            body_params,
1954            if HAS_TIME_UNIT {
1955                self.configuration.time_unit
1956            } else {
1957                None
1958            },
1959            true,
1960        )
1961        .await
1962    }
1963
1964    async fn get_flexible_subscription_record(
1965        &self,
1966        params: GetFlexibleSubscriptionRecordParams,
1967    ) -> anyhow::Result<RestApiResponse<models::GetFlexibleSubscriptionRecordResponse>> {
1968        let GetFlexibleSubscriptionRecordParams {
1969            product_id,
1970            purchase_id,
1971            asset,
1972            start_time,
1973            end_time,
1974            current,
1975            size,
1976            recv_window,
1977        } = params;
1978
1979        let mut query_params = BTreeMap::new();
1980        let body_params = BTreeMap::new();
1981
1982        if let Some(rw) = product_id {
1983            query_params.insert("productId".to_string(), json!(rw));
1984        }
1985
1986        if let Some(rw) = purchase_id {
1987            query_params.insert("purchaseId".to_string(), json!(rw));
1988        }
1989
1990        if let Some(rw) = asset {
1991            query_params.insert("asset".to_string(), json!(rw));
1992        }
1993
1994        if let Some(rw) = start_time {
1995            query_params.insert("startTime".to_string(), json!(rw));
1996        }
1997
1998        if let Some(rw) = end_time {
1999            query_params.insert("endTime".to_string(), json!(rw));
2000        }
2001
2002        if let Some(rw) = current {
2003            query_params.insert("current".to_string(), json!(rw));
2004        }
2005
2006        if let Some(rw) = size {
2007            query_params.insert("size".to_string(), json!(rw));
2008        }
2009
2010        if let Some(rw) = recv_window {
2011            query_params.insert("recvWindow".to_string(), json!(rw));
2012        }
2013
2014        send_request::<models::GetFlexibleSubscriptionRecordResponse>(
2015            &self.configuration,
2016            "/sapi/v1/simple-earn/flexible/history/subscriptionRecord",
2017            reqwest::Method::GET,
2018            query_params,
2019            body_params,
2020            if HAS_TIME_UNIT {
2021                self.configuration.time_unit
2022            } else {
2023                None
2024            },
2025            true,
2026        )
2027        .await
2028    }
2029
2030    async fn get_locked_personal_left_quota(
2031        &self,
2032        params: GetLockedPersonalLeftQuotaParams,
2033    ) -> anyhow::Result<RestApiResponse<models::GetLockedPersonalLeftQuotaResponse>> {
2034        let GetLockedPersonalLeftQuotaParams {
2035            project_id,
2036            recv_window,
2037        } = params;
2038
2039        let mut query_params = BTreeMap::new();
2040        let body_params = BTreeMap::new();
2041
2042        query_params.insert("projectId".to_string(), json!(project_id));
2043
2044        if let Some(rw) = recv_window {
2045            query_params.insert("recvWindow".to_string(), json!(rw));
2046        }
2047
2048        send_request::<models::GetLockedPersonalLeftQuotaResponse>(
2049            &self.configuration,
2050            "/sapi/v1/simple-earn/locked/personalLeftQuota",
2051            reqwest::Method::GET,
2052            query_params,
2053            body_params,
2054            if HAS_TIME_UNIT {
2055                self.configuration.time_unit
2056            } else {
2057                None
2058            },
2059            true,
2060        )
2061        .await
2062    }
2063
2064    async fn get_locked_product_position(
2065        &self,
2066        params: GetLockedProductPositionParams,
2067    ) -> anyhow::Result<RestApiResponse<models::GetLockedProductPositionResponse>> {
2068        let GetLockedProductPositionParams {
2069            asset,
2070            position_id,
2071            project_id,
2072            current,
2073            size,
2074            recv_window,
2075        } = params;
2076
2077        let mut query_params = BTreeMap::new();
2078        let body_params = BTreeMap::new();
2079
2080        if let Some(rw) = asset {
2081            query_params.insert("asset".to_string(), json!(rw));
2082        }
2083
2084        if let Some(rw) = position_id {
2085            query_params.insert("positionId".to_string(), json!(rw));
2086        }
2087
2088        if let Some(rw) = project_id {
2089            query_params.insert("projectId".to_string(), json!(rw));
2090        }
2091
2092        if let Some(rw) = current {
2093            query_params.insert("current".to_string(), json!(rw));
2094        }
2095
2096        if let Some(rw) = size {
2097            query_params.insert("size".to_string(), json!(rw));
2098        }
2099
2100        if let Some(rw) = recv_window {
2101            query_params.insert("recvWindow".to_string(), json!(rw));
2102        }
2103
2104        send_request::<models::GetLockedProductPositionResponse>(
2105            &self.configuration,
2106            "/sapi/v1/simple-earn/locked/position",
2107            reqwest::Method::GET,
2108            query_params,
2109            body_params,
2110            if HAS_TIME_UNIT {
2111                self.configuration.time_unit
2112            } else {
2113                None
2114            },
2115            true,
2116        )
2117        .await
2118    }
2119
2120    async fn get_locked_redemption_record(
2121        &self,
2122        params: GetLockedRedemptionRecordParams,
2123    ) -> anyhow::Result<RestApiResponse<models::GetLockedRedemptionRecordResponse>> {
2124        let GetLockedRedemptionRecordParams {
2125            position_id,
2126            redeem_id,
2127            asset,
2128            start_time,
2129            end_time,
2130            current,
2131            size,
2132            recv_window,
2133        } = params;
2134
2135        let mut query_params = BTreeMap::new();
2136        let body_params = BTreeMap::new();
2137
2138        if let Some(rw) = position_id {
2139            query_params.insert("positionId".to_string(), json!(rw));
2140        }
2141
2142        if let Some(rw) = redeem_id {
2143            query_params.insert("redeemId".to_string(), json!(rw));
2144        }
2145
2146        if let Some(rw) = asset {
2147            query_params.insert("asset".to_string(), json!(rw));
2148        }
2149
2150        if let Some(rw) = start_time {
2151            query_params.insert("startTime".to_string(), json!(rw));
2152        }
2153
2154        if let Some(rw) = end_time {
2155            query_params.insert("endTime".to_string(), json!(rw));
2156        }
2157
2158        if let Some(rw) = current {
2159            query_params.insert("current".to_string(), json!(rw));
2160        }
2161
2162        if let Some(rw) = size {
2163            query_params.insert("size".to_string(), json!(rw));
2164        }
2165
2166        if let Some(rw) = recv_window {
2167            query_params.insert("recvWindow".to_string(), json!(rw));
2168        }
2169
2170        send_request::<models::GetLockedRedemptionRecordResponse>(
2171            &self.configuration,
2172            "/sapi/v1/simple-earn/locked/history/redemptionRecord",
2173            reqwest::Method::GET,
2174            query_params,
2175            body_params,
2176            if HAS_TIME_UNIT {
2177                self.configuration.time_unit
2178            } else {
2179                None
2180            },
2181            true,
2182        )
2183        .await
2184    }
2185
2186    async fn get_locked_rewards_history(
2187        &self,
2188        params: GetLockedRewardsHistoryParams,
2189    ) -> anyhow::Result<RestApiResponse<models::GetLockedRewardsHistoryResponse>> {
2190        let GetLockedRewardsHistoryParams {
2191            position_id,
2192            asset,
2193            start_time,
2194            end_time,
2195            current,
2196            size,
2197            recv_window,
2198        } = params;
2199
2200        let mut query_params = BTreeMap::new();
2201        let body_params = BTreeMap::new();
2202
2203        if let Some(rw) = position_id {
2204            query_params.insert("positionId".to_string(), json!(rw));
2205        }
2206
2207        if let Some(rw) = asset {
2208            query_params.insert("asset".to_string(), json!(rw));
2209        }
2210
2211        if let Some(rw) = start_time {
2212            query_params.insert("startTime".to_string(), json!(rw));
2213        }
2214
2215        if let Some(rw) = end_time {
2216            query_params.insert("endTime".to_string(), json!(rw));
2217        }
2218
2219        if let Some(rw) = current {
2220            query_params.insert("current".to_string(), json!(rw));
2221        }
2222
2223        if let Some(rw) = size {
2224            query_params.insert("size".to_string(), json!(rw));
2225        }
2226
2227        if let Some(rw) = recv_window {
2228            query_params.insert("recvWindow".to_string(), json!(rw));
2229        }
2230
2231        send_request::<models::GetLockedRewardsHistoryResponse>(
2232            &self.configuration,
2233            "/sapi/v1/simple-earn/locked/history/rewardsRecord",
2234            reqwest::Method::GET,
2235            query_params,
2236            body_params,
2237            if HAS_TIME_UNIT {
2238                self.configuration.time_unit
2239            } else {
2240                None
2241            },
2242            true,
2243        )
2244        .await
2245    }
2246
2247    async fn get_locked_subscription_preview(
2248        &self,
2249        params: GetLockedSubscriptionPreviewParams,
2250    ) -> anyhow::Result<RestApiResponse<Vec<models::GetLockedSubscriptionPreviewResponseInner>>>
2251    {
2252        let GetLockedSubscriptionPreviewParams {
2253            project_id,
2254            amount,
2255            auto_subscribe,
2256            recv_window,
2257        } = params;
2258
2259        let mut query_params = BTreeMap::new();
2260        let body_params = BTreeMap::new();
2261
2262        query_params.insert("projectId".to_string(), json!(project_id));
2263
2264        query_params.insert("amount".to_string(), json!(amount));
2265
2266        if let Some(rw) = auto_subscribe {
2267            query_params.insert("autoSubscribe".to_string(), json!(rw));
2268        }
2269
2270        if let Some(rw) = recv_window {
2271            query_params.insert("recvWindow".to_string(), json!(rw));
2272        }
2273
2274        send_request::<Vec<models::GetLockedSubscriptionPreviewResponseInner>>(
2275            &self.configuration,
2276            "/sapi/v1/simple-earn/locked/subscriptionPreview",
2277            reqwest::Method::GET,
2278            query_params,
2279            body_params,
2280            if HAS_TIME_UNIT {
2281                self.configuration.time_unit
2282            } else {
2283                None
2284            },
2285            true,
2286        )
2287        .await
2288    }
2289
2290    async fn get_locked_subscription_record(
2291        &self,
2292        params: GetLockedSubscriptionRecordParams,
2293    ) -> anyhow::Result<RestApiResponse<models::GetLockedSubscriptionRecordResponse>> {
2294        let GetLockedSubscriptionRecordParams {
2295            purchase_id,
2296            asset,
2297            start_time,
2298            end_time,
2299            current,
2300            size,
2301            recv_window,
2302        } = params;
2303
2304        let mut query_params = BTreeMap::new();
2305        let body_params = BTreeMap::new();
2306
2307        if let Some(rw) = purchase_id {
2308            query_params.insert("purchaseId".to_string(), json!(rw));
2309        }
2310
2311        if let Some(rw) = asset {
2312            query_params.insert("asset".to_string(), json!(rw));
2313        }
2314
2315        if let Some(rw) = start_time {
2316            query_params.insert("startTime".to_string(), json!(rw));
2317        }
2318
2319        if let Some(rw) = end_time {
2320            query_params.insert("endTime".to_string(), json!(rw));
2321        }
2322
2323        if let Some(rw) = current {
2324            query_params.insert("current".to_string(), json!(rw));
2325        }
2326
2327        if let Some(rw) = size {
2328            query_params.insert("size".to_string(), json!(rw));
2329        }
2330
2331        if let Some(rw) = recv_window {
2332            query_params.insert("recvWindow".to_string(), json!(rw));
2333        }
2334
2335        send_request::<models::GetLockedSubscriptionRecordResponse>(
2336            &self.configuration,
2337            "/sapi/v1/simple-earn/locked/history/subscriptionRecord",
2338            reqwest::Method::GET,
2339            query_params,
2340            body_params,
2341            if HAS_TIME_UNIT {
2342                self.configuration.time_unit
2343            } else {
2344                None
2345            },
2346            true,
2347        )
2348        .await
2349    }
2350
2351    async fn get_rate_history(
2352        &self,
2353        params: GetRateHistoryParams,
2354    ) -> anyhow::Result<RestApiResponse<models::GetRateHistoryResponse>> {
2355        let GetRateHistoryParams {
2356            product_id,
2357            apr_period,
2358            start_time,
2359            end_time,
2360            current,
2361            size,
2362            recv_window,
2363        } = params;
2364
2365        let mut query_params = BTreeMap::new();
2366        let body_params = BTreeMap::new();
2367
2368        query_params.insert("productId".to_string(), json!(product_id));
2369
2370        if let Some(rw) = apr_period {
2371            query_params.insert("aprPeriod".to_string(), json!(rw));
2372        }
2373
2374        if let Some(rw) = start_time {
2375            query_params.insert("startTime".to_string(), json!(rw));
2376        }
2377
2378        if let Some(rw) = end_time {
2379            query_params.insert("endTime".to_string(), json!(rw));
2380        }
2381
2382        if let Some(rw) = current {
2383            query_params.insert("current".to_string(), json!(rw));
2384        }
2385
2386        if let Some(rw) = size {
2387            query_params.insert("size".to_string(), json!(rw));
2388        }
2389
2390        if let Some(rw) = recv_window {
2391            query_params.insert("recvWindow".to_string(), json!(rw));
2392        }
2393
2394        send_request::<models::GetRateHistoryResponse>(
2395            &self.configuration,
2396            "/sapi/v1/simple-earn/flexible/history/rateHistory",
2397            reqwest::Method::GET,
2398            query_params,
2399            body_params,
2400            if HAS_TIME_UNIT {
2401                self.configuration.time_unit
2402            } else {
2403                None
2404            },
2405            true,
2406        )
2407        .await
2408    }
2409
2410    async fn get_simple_earn_flexible_product_list(
2411        &self,
2412        params: GetSimpleEarnFlexibleProductListParams,
2413    ) -> anyhow::Result<RestApiResponse<models::GetSimpleEarnFlexibleProductListResponse>> {
2414        let GetSimpleEarnFlexibleProductListParams {
2415            asset,
2416            current,
2417            size,
2418            recv_window,
2419        } = params;
2420
2421        let mut query_params = BTreeMap::new();
2422        let body_params = BTreeMap::new();
2423
2424        if let Some(rw) = asset {
2425            query_params.insert("asset".to_string(), json!(rw));
2426        }
2427
2428        if let Some(rw) = current {
2429            query_params.insert("current".to_string(), json!(rw));
2430        }
2431
2432        if let Some(rw) = size {
2433            query_params.insert("size".to_string(), json!(rw));
2434        }
2435
2436        if let Some(rw) = recv_window {
2437            query_params.insert("recvWindow".to_string(), json!(rw));
2438        }
2439
2440        send_request::<models::GetSimpleEarnFlexibleProductListResponse>(
2441            &self.configuration,
2442            "/sapi/v1/simple-earn/flexible/list",
2443            reqwest::Method::GET,
2444            query_params,
2445            body_params,
2446            if HAS_TIME_UNIT {
2447                self.configuration.time_unit
2448            } else {
2449                None
2450            },
2451            true,
2452        )
2453        .await
2454    }
2455
2456    async fn get_simple_earn_locked_product_list(
2457        &self,
2458        params: GetSimpleEarnLockedProductListParams,
2459    ) -> anyhow::Result<RestApiResponse<models::GetSimpleEarnLockedProductListResponse>> {
2460        let GetSimpleEarnLockedProductListParams {
2461            asset,
2462            current,
2463            size,
2464            recv_window,
2465        } = params;
2466
2467        let mut query_params = BTreeMap::new();
2468        let body_params = BTreeMap::new();
2469
2470        if let Some(rw) = asset {
2471            query_params.insert("asset".to_string(), json!(rw));
2472        }
2473
2474        if let Some(rw) = current {
2475            query_params.insert("current".to_string(), json!(rw));
2476        }
2477
2478        if let Some(rw) = size {
2479            query_params.insert("size".to_string(), json!(rw));
2480        }
2481
2482        if let Some(rw) = recv_window {
2483            query_params.insert("recvWindow".to_string(), json!(rw));
2484        }
2485
2486        send_request::<models::GetSimpleEarnLockedProductListResponse>(
2487            &self.configuration,
2488            "/sapi/v1/simple-earn/locked/list",
2489            reqwest::Method::GET,
2490            query_params,
2491            body_params,
2492            if HAS_TIME_UNIT {
2493                self.configuration.time_unit
2494            } else {
2495                None
2496            },
2497            true,
2498        )
2499        .await
2500    }
2501
2502    async fn redeem_flexible_product(
2503        &self,
2504        params: RedeemFlexibleProductParams,
2505    ) -> anyhow::Result<RestApiResponse<models::RedeemFlexibleProductResponse>> {
2506        let RedeemFlexibleProductParams {
2507            product_id,
2508            redeem_all,
2509            amount,
2510            dest_account,
2511            recv_window,
2512        } = params;
2513
2514        let mut query_params = BTreeMap::new();
2515        let body_params = BTreeMap::new();
2516
2517        query_params.insert("productId".to_string(), json!(product_id));
2518
2519        if let Some(rw) = redeem_all {
2520            query_params.insert("redeemAll".to_string(), json!(rw));
2521        }
2522
2523        if let Some(rw) = amount {
2524            query_params.insert("amount".to_string(), json!(rw));
2525        }
2526
2527        if let Some(rw) = dest_account {
2528            query_params.insert("destAccount".to_string(), json!(rw));
2529        }
2530
2531        if let Some(rw) = recv_window {
2532            query_params.insert("recvWindow".to_string(), json!(rw));
2533        }
2534
2535        send_request::<models::RedeemFlexibleProductResponse>(
2536            &self.configuration,
2537            "/sapi/v1/simple-earn/flexible/redeem",
2538            reqwest::Method::POST,
2539            query_params,
2540            body_params,
2541            if HAS_TIME_UNIT {
2542                self.configuration.time_unit
2543            } else {
2544                None
2545            },
2546            true,
2547        )
2548        .await
2549    }
2550
2551    async fn redeem_locked_product(
2552        &self,
2553        params: RedeemLockedProductParams,
2554    ) -> anyhow::Result<RestApiResponse<models::RedeemLockedProductResponse>> {
2555        let RedeemLockedProductParams {
2556            position_id,
2557            recv_window,
2558        } = params;
2559
2560        let mut query_params = BTreeMap::new();
2561        let body_params = BTreeMap::new();
2562
2563        query_params.insert("positionId".to_string(), json!(position_id));
2564
2565        if let Some(rw) = recv_window {
2566            query_params.insert("recvWindow".to_string(), json!(rw));
2567        }
2568
2569        send_request::<models::RedeemLockedProductResponse>(
2570            &self.configuration,
2571            "/sapi/v1/simple-earn/locked/redeem",
2572            reqwest::Method::POST,
2573            query_params,
2574            body_params,
2575            if HAS_TIME_UNIT {
2576                self.configuration.time_unit
2577            } else {
2578                None
2579            },
2580            true,
2581        )
2582        .await
2583    }
2584
2585    async fn set_flexible_auto_subscribe(
2586        &self,
2587        params: SetFlexibleAutoSubscribeParams,
2588    ) -> anyhow::Result<RestApiResponse<models::SetFlexibleAutoSubscribeResponse>> {
2589        let SetFlexibleAutoSubscribeParams {
2590            product_id,
2591            auto_subscribe,
2592            recv_window,
2593        } = params;
2594
2595        let mut query_params = BTreeMap::new();
2596        let body_params = BTreeMap::new();
2597
2598        query_params.insert("productId".to_string(), json!(product_id));
2599
2600        query_params.insert("autoSubscribe".to_string(), json!(auto_subscribe));
2601
2602        if let Some(rw) = recv_window {
2603            query_params.insert("recvWindow".to_string(), json!(rw));
2604        }
2605
2606        send_request::<models::SetFlexibleAutoSubscribeResponse>(
2607            &self.configuration,
2608            "/sapi/v1/simple-earn/flexible/setAutoSubscribe",
2609            reqwest::Method::POST,
2610            query_params,
2611            body_params,
2612            if HAS_TIME_UNIT {
2613                self.configuration.time_unit
2614            } else {
2615                None
2616            },
2617            true,
2618        )
2619        .await
2620    }
2621
2622    async fn set_locked_auto_subscribe(
2623        &self,
2624        params: SetLockedAutoSubscribeParams,
2625    ) -> anyhow::Result<RestApiResponse<models::SetLockedAutoSubscribeResponse>> {
2626        let SetLockedAutoSubscribeParams {
2627            position_id,
2628            auto_subscribe,
2629            recv_window,
2630        } = params;
2631
2632        let mut query_params = BTreeMap::new();
2633        let body_params = BTreeMap::new();
2634
2635        query_params.insert("positionId".to_string(), json!(position_id));
2636
2637        query_params.insert("autoSubscribe".to_string(), json!(auto_subscribe));
2638
2639        if let Some(rw) = recv_window {
2640            query_params.insert("recvWindow".to_string(), json!(rw));
2641        }
2642
2643        send_request::<models::SetLockedAutoSubscribeResponse>(
2644            &self.configuration,
2645            "/sapi/v1/simple-earn/locked/setAutoSubscribe",
2646            reqwest::Method::POST,
2647            query_params,
2648            body_params,
2649            if HAS_TIME_UNIT {
2650                self.configuration.time_unit
2651            } else {
2652                None
2653            },
2654            true,
2655        )
2656        .await
2657    }
2658
2659    async fn set_locked_product_redeem_option(
2660        &self,
2661        params: SetLockedProductRedeemOptionParams,
2662    ) -> anyhow::Result<RestApiResponse<models::SetLockedProductRedeemOptionResponse>> {
2663        let SetLockedProductRedeemOptionParams {
2664            position_id,
2665            redeem_to,
2666            recv_window,
2667        } = params;
2668
2669        let mut query_params = BTreeMap::new();
2670        let body_params = BTreeMap::new();
2671
2672        query_params.insert("positionId".to_string(), json!(position_id));
2673
2674        query_params.insert("redeemTo".to_string(), json!(redeem_to));
2675
2676        if let Some(rw) = recv_window {
2677            query_params.insert("recvWindow".to_string(), json!(rw));
2678        }
2679
2680        send_request::<models::SetLockedProductRedeemOptionResponse>(
2681            &self.configuration,
2682            "/sapi/v1/simple-earn/locked/setRedeemOption",
2683            reqwest::Method::POST,
2684            query_params,
2685            body_params,
2686            if HAS_TIME_UNIT {
2687                self.configuration.time_unit
2688            } else {
2689                None
2690            },
2691            true,
2692        )
2693        .await
2694    }
2695
2696    async fn simple_account(
2697        &self,
2698        params: SimpleAccountParams,
2699    ) -> anyhow::Result<RestApiResponse<models::SimpleAccountResponse>> {
2700        let SimpleAccountParams { recv_window } = params;
2701
2702        let mut query_params = BTreeMap::new();
2703        let body_params = BTreeMap::new();
2704
2705        if let Some(rw) = recv_window {
2706            query_params.insert("recvWindow".to_string(), json!(rw));
2707        }
2708
2709        send_request::<models::SimpleAccountResponse>(
2710            &self.configuration,
2711            "/sapi/v1/simple-earn/account",
2712            reqwest::Method::GET,
2713            query_params,
2714            body_params,
2715            if HAS_TIME_UNIT {
2716                self.configuration.time_unit
2717            } else {
2718                None
2719            },
2720            true,
2721        )
2722        .await
2723    }
2724
2725    async fn subscribe_flexible_product(
2726        &self,
2727        params: SubscribeFlexibleProductParams,
2728    ) -> anyhow::Result<RestApiResponse<models::SubscribeFlexibleProductResponse>> {
2729        let SubscribeFlexibleProductParams {
2730            product_id,
2731            amount,
2732            auto_subscribe,
2733            source_account,
2734            recv_window,
2735        } = params;
2736
2737        let mut query_params = BTreeMap::new();
2738        let body_params = BTreeMap::new();
2739
2740        query_params.insert("productId".to_string(), json!(product_id));
2741
2742        query_params.insert("amount".to_string(), json!(amount));
2743
2744        if let Some(rw) = auto_subscribe {
2745            query_params.insert("autoSubscribe".to_string(), json!(rw));
2746        }
2747
2748        if let Some(rw) = source_account {
2749            query_params.insert("sourceAccount".to_string(), json!(rw));
2750        }
2751
2752        if let Some(rw) = recv_window {
2753            query_params.insert("recvWindow".to_string(), json!(rw));
2754        }
2755
2756        send_request::<models::SubscribeFlexibleProductResponse>(
2757            &self.configuration,
2758            "/sapi/v1/simple-earn/flexible/subscribe",
2759            reqwest::Method::POST,
2760            query_params,
2761            body_params,
2762            if HAS_TIME_UNIT {
2763                self.configuration.time_unit
2764            } else {
2765                None
2766            },
2767            true,
2768        )
2769        .await
2770    }
2771
2772    async fn subscribe_locked_product(
2773        &self,
2774        params: SubscribeLockedProductParams,
2775    ) -> anyhow::Result<RestApiResponse<models::SubscribeLockedProductResponse>> {
2776        let SubscribeLockedProductParams {
2777            project_id,
2778            amount,
2779            auto_subscribe,
2780            source_account,
2781            redeem_to,
2782            recv_window,
2783        } = params;
2784
2785        let mut query_params = BTreeMap::new();
2786        let body_params = BTreeMap::new();
2787
2788        query_params.insert("projectId".to_string(), json!(project_id));
2789
2790        query_params.insert("amount".to_string(), json!(amount));
2791
2792        if let Some(rw) = auto_subscribe {
2793            query_params.insert("autoSubscribe".to_string(), json!(rw));
2794        }
2795
2796        if let Some(rw) = source_account {
2797            query_params.insert("sourceAccount".to_string(), json!(rw));
2798        }
2799
2800        if let Some(rw) = redeem_to {
2801            query_params.insert("redeemTo".to_string(), json!(rw));
2802        }
2803
2804        if let Some(rw) = recv_window {
2805            query_params.insert("recvWindow".to_string(), json!(rw));
2806        }
2807
2808        send_request::<models::SubscribeLockedProductResponse>(
2809            &self.configuration,
2810            "/sapi/v1/simple-earn/locked/subscribe",
2811            reqwest::Method::POST,
2812            query_params,
2813            body_params,
2814            if HAS_TIME_UNIT {
2815                self.configuration.time_unit
2816            } else {
2817                None
2818            },
2819            true,
2820        )
2821        .await
2822    }
2823}
2824
2825#[cfg(all(test, feature = "simple_earn"))]
2826mod tests {
2827    use super::*;
2828    use crate::TOKIO_SHARED_RT;
2829    use crate::{errors::ConnectorError, models::DataFuture, models::RestApiRateLimit};
2830    use async_trait::async_trait;
2831    use std::collections::HashMap;
2832
2833    struct DummyRestApiResponse<T> {
2834        inner: Box<dyn FnOnce() -> DataFuture<Result<T, ConnectorError>> + Send + Sync>,
2835        status: u16,
2836        headers: HashMap<String, String>,
2837        rate_limits: Option<Vec<RestApiRateLimit>>,
2838    }
2839
2840    impl<T> From<DummyRestApiResponse<T>> for RestApiResponse<T> {
2841        fn from(dummy: DummyRestApiResponse<T>) -> Self {
2842            Self {
2843                data_fn: dummy.inner,
2844                status: dummy.status,
2845                headers: dummy.headers,
2846                rate_limits: dummy.rate_limits,
2847            }
2848        }
2849    }
2850
2851    struct MockFlexibleLockedApiClient {
2852        force_error: bool,
2853    }
2854
2855    #[async_trait]
2856    impl FlexibleLockedApi for MockFlexibleLockedApiClient {
2857        async fn get_collateral_record(
2858            &self,
2859            _params: GetCollateralRecordParams,
2860        ) -> anyhow::Result<RestApiResponse<models::GetCollateralRecordResponse>> {
2861            if self.force_error {
2862                return Err(ConnectorError::ConnectorClientError {
2863                    msg: "ResponseError".to_string(),
2864                    code: None,
2865                }
2866                .into());
2867            }
2868
2869            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!({}));
2870            let dummy_response: models::GetCollateralRecordResponse =
2871                serde_json::from_value(resp_json.clone())
2872                    .expect("should parse into models::GetCollateralRecordResponse");
2873
2874            let dummy = DummyRestApiResponse {
2875                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
2876                status: 200,
2877                headers: HashMap::new(),
2878                rate_limits: None,
2879            };
2880
2881            Ok(dummy.into())
2882        }
2883
2884        async fn get_flexible_personal_left_quota(
2885            &self,
2886            _params: GetFlexiblePersonalLeftQuotaParams,
2887        ) -> anyhow::Result<RestApiResponse<models::GetFlexiblePersonalLeftQuotaResponse>> {
2888            if self.force_error {
2889                return Err(ConnectorError::ConnectorClientError {
2890                    msg: "ResponseError".to_string(),
2891                    code: None,
2892                }
2893                .into());
2894            }
2895
2896            let resp_json: Value = serde_json::from_str(r#"{"leftPersonalQuota":"1000"}"#)
2897                .unwrap_or_else(|_| serde_json::json!({}));
2898            let dummy_response: models::GetFlexiblePersonalLeftQuotaResponse =
2899                serde_json::from_value(resp_json.clone())
2900                    .expect("should parse into models::GetFlexiblePersonalLeftQuotaResponse");
2901
2902            let dummy = DummyRestApiResponse {
2903                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
2904                status: 200,
2905                headers: HashMap::new(),
2906                rate_limits: None,
2907            };
2908
2909            Ok(dummy.into())
2910        }
2911
2912        async fn get_flexible_product_position(
2913            &self,
2914            _params: GetFlexibleProductPositionParams,
2915        ) -> anyhow::Result<RestApiResponse<models::GetFlexibleProductPositionResponse>> {
2916            if self.force_error {
2917                return Err(ConnectorError::ConnectorClientError {
2918                    msg: "ResponseError".to_string(),
2919                    code: None,
2920                }
2921                .into());
2922            }
2923
2924            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!({}));
2925            let dummy_response: models::GetFlexibleProductPositionResponse =
2926                serde_json::from_value(resp_json.clone())
2927                    .expect("should parse into models::GetFlexibleProductPositionResponse");
2928
2929            let dummy = DummyRestApiResponse {
2930                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
2931                status: 200,
2932                headers: HashMap::new(),
2933                rate_limits: None,
2934            };
2935
2936            Ok(dummy.into())
2937        }
2938
2939        async fn get_flexible_redemption_record(
2940            &self,
2941            _params: GetFlexibleRedemptionRecordParams,
2942        ) -> anyhow::Result<RestApiResponse<models::GetFlexibleRedemptionRecordResponse>> {
2943            if self.force_error {
2944                return Err(ConnectorError::ConnectorClientError {
2945                    msg: "ResponseError".to_string(),
2946                    code: None,
2947                }
2948                .into());
2949            }
2950
2951            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!({}));
2952            let dummy_response: models::GetFlexibleRedemptionRecordResponse =
2953                serde_json::from_value(resp_json.clone())
2954                    .expect("should parse into models::GetFlexibleRedemptionRecordResponse");
2955
2956            let dummy = DummyRestApiResponse {
2957                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
2958                status: 200,
2959                headers: HashMap::new(),
2960                rate_limits: None,
2961            };
2962
2963            Ok(dummy.into())
2964        }
2965
2966        async fn get_flexible_rewards_history(
2967            &self,
2968            _params: GetFlexibleRewardsHistoryParams,
2969        ) -> anyhow::Result<RestApiResponse<models::GetFlexibleRewardsHistoryResponse>> {
2970            if self.force_error {
2971                return Err(ConnectorError::ConnectorClientError {
2972                    msg: "ResponseError".to_string(),
2973                    code: None,
2974                }
2975                .into());
2976            }
2977
2978            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!({}));
2979            let dummy_response: models::GetFlexibleRewardsHistoryResponse =
2980                serde_json::from_value(resp_json.clone())
2981                    .expect("should parse into models::GetFlexibleRewardsHistoryResponse");
2982
2983            let dummy = DummyRestApiResponse {
2984                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
2985                status: 200,
2986                headers: HashMap::new(),
2987                rate_limits: None,
2988            };
2989
2990            Ok(dummy.into())
2991        }
2992
2993        async fn get_flexible_subscription_preview(
2994            &self,
2995            _params: GetFlexibleSubscriptionPreviewParams,
2996        ) -> anyhow::Result<RestApiResponse<models::GetFlexibleSubscriptionPreviewResponse>>
2997        {
2998            if self.force_error {
2999                return Err(ConnectorError::ConnectorClientError {
3000                    msg: "ResponseError".to_string(),
3001                    code: None,
3002                }
3003                .into());
3004            }
3005
3006            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!({}));
3007            let dummy_response: models::GetFlexibleSubscriptionPreviewResponse =
3008                serde_json::from_value(resp_json.clone())
3009                    .expect("should parse into models::GetFlexibleSubscriptionPreviewResponse");
3010
3011            let dummy = DummyRestApiResponse {
3012                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3013                status: 200,
3014                headers: HashMap::new(),
3015                rate_limits: None,
3016            };
3017
3018            Ok(dummy.into())
3019        }
3020
3021        async fn get_flexible_subscription_record(
3022            &self,
3023            _params: GetFlexibleSubscriptionRecordParams,
3024        ) -> anyhow::Result<RestApiResponse<models::GetFlexibleSubscriptionRecordResponse>>
3025        {
3026            if self.force_error {
3027                return Err(ConnectorError::ConnectorClientError {
3028                    msg: "ResponseError".to_string(),
3029                    code: None,
3030                }
3031                .into());
3032            }
3033
3034            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!({}));
3035            let dummy_response: models::GetFlexibleSubscriptionRecordResponse =
3036                serde_json::from_value(resp_json.clone())
3037                    .expect("should parse into models::GetFlexibleSubscriptionRecordResponse");
3038
3039            let dummy = DummyRestApiResponse {
3040                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3041                status: 200,
3042                headers: HashMap::new(),
3043                rate_limits: None,
3044            };
3045
3046            Ok(dummy.into())
3047        }
3048
3049        async fn get_locked_personal_left_quota(
3050            &self,
3051            _params: GetLockedPersonalLeftQuotaParams,
3052        ) -> anyhow::Result<RestApiResponse<models::GetLockedPersonalLeftQuotaResponse>> {
3053            if self.force_error {
3054                return Err(ConnectorError::ConnectorClientError {
3055                    msg: "ResponseError".to_string(),
3056                    code: None,
3057                }
3058                .into());
3059            }
3060
3061            let resp_json: Value = serde_json::from_str(r#"{"leftPersonalQuota":"1000"}"#)
3062                .unwrap_or_else(|_| serde_json::json!({}));
3063            let dummy_response: models::GetLockedPersonalLeftQuotaResponse =
3064                serde_json::from_value(resp_json.clone())
3065                    .expect("should parse into models::GetLockedPersonalLeftQuotaResponse");
3066
3067            let dummy = DummyRestApiResponse {
3068                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3069                status: 200,
3070                headers: HashMap::new(),
3071                rate_limits: None,
3072            };
3073
3074            Ok(dummy.into())
3075        }
3076
3077        async fn get_locked_product_position(
3078            &self,
3079            _params: GetLockedProductPositionParams,
3080        ) -> anyhow::Result<RestApiResponse<models::GetLockedProductPositionResponse>> {
3081            if self.force_error {
3082                return Err(ConnectorError::ConnectorClientError {
3083                    msg: "ResponseError".to_string(),
3084                    code: None,
3085                }
3086                .into());
3087            }
3088
3089            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!({}));
3090            let dummy_response: models::GetLockedProductPositionResponse =
3091                serde_json::from_value(resp_json.clone())
3092                    .expect("should parse into models::GetLockedProductPositionResponse");
3093
3094            let dummy = DummyRestApiResponse {
3095                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3096                status: 200,
3097                headers: HashMap::new(),
3098                rate_limits: None,
3099            };
3100
3101            Ok(dummy.into())
3102        }
3103
3104        async fn get_locked_redemption_record(
3105            &self,
3106            _params: GetLockedRedemptionRecordParams,
3107        ) -> anyhow::Result<RestApiResponse<models::GetLockedRedemptionRecordResponse>> {
3108            if self.force_error {
3109                return Err(ConnectorError::ConnectorClientError {
3110                    msg: "ResponseError".to_string(),
3111                    code: None,
3112                }
3113                .into());
3114            }
3115
3116            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!({}));
3117            let dummy_response: models::GetLockedRedemptionRecordResponse =
3118                serde_json::from_value(resp_json.clone())
3119                    .expect("should parse into models::GetLockedRedemptionRecordResponse");
3120
3121            let dummy = DummyRestApiResponse {
3122                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3123                status: 200,
3124                headers: HashMap::new(),
3125                rate_limits: None,
3126            };
3127
3128            Ok(dummy.into())
3129        }
3130
3131        async fn get_locked_rewards_history(
3132            &self,
3133            _params: GetLockedRewardsHistoryParams,
3134        ) -> anyhow::Result<RestApiResponse<models::GetLockedRewardsHistoryResponse>> {
3135            if self.force_error {
3136                return Err(ConnectorError::ConnectorClientError {
3137                    msg: "ResponseError".to_string(),
3138                    code: None,
3139                }
3140                .into());
3141            }
3142
3143            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!({}));
3144            let dummy_response: models::GetLockedRewardsHistoryResponse =
3145                serde_json::from_value(resp_json.clone())
3146                    .expect("should parse into models::GetLockedRewardsHistoryResponse");
3147
3148            let dummy = DummyRestApiResponse {
3149                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3150                status: 200,
3151                headers: HashMap::new(),
3152                rate_limits: None,
3153            };
3154
3155            Ok(dummy.into())
3156        }
3157
3158        async fn get_locked_subscription_preview(
3159            &self,
3160            _params: GetLockedSubscriptionPreviewParams,
3161        ) -> anyhow::Result<RestApiResponse<Vec<models::GetLockedSubscriptionPreviewResponseInner>>>
3162        {
3163            if self.force_error {
3164                return Err(ConnectorError::ConnectorClientError {
3165                    msg: "ResponseError".to_string(),
3166                    code: None,
3167                }
3168                .into());
3169            }
3170
3171            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!({}));
3172            let dummy_response: Vec<models::GetLockedSubscriptionPreviewResponseInner> =
3173                serde_json::from_value(resp_json.clone()).expect(
3174                    "should parse into Vec<models::GetLockedSubscriptionPreviewResponseInner>",
3175                );
3176
3177            let dummy = DummyRestApiResponse {
3178                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3179                status: 200,
3180                headers: HashMap::new(),
3181                rate_limits: None,
3182            };
3183
3184            Ok(dummy.into())
3185        }
3186
3187        async fn get_locked_subscription_record(
3188            &self,
3189            _params: GetLockedSubscriptionRecordParams,
3190        ) -> anyhow::Result<RestApiResponse<models::GetLockedSubscriptionRecordResponse>> {
3191            if self.force_error {
3192                return Err(ConnectorError::ConnectorClientError {
3193                    msg: "ResponseError".to_string(),
3194                    code: None,
3195                }
3196                .into());
3197            }
3198
3199            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!({}));
3200            let dummy_response: models::GetLockedSubscriptionRecordResponse =
3201                serde_json::from_value(resp_json.clone())
3202                    .expect("should parse into models::GetLockedSubscriptionRecordResponse");
3203
3204            let dummy = DummyRestApiResponse {
3205                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3206                status: 200,
3207                headers: HashMap::new(),
3208                rate_limits: None,
3209            };
3210
3211            Ok(dummy.into())
3212        }
3213
3214        async fn get_rate_history(
3215            &self,
3216            _params: GetRateHistoryParams,
3217        ) -> anyhow::Result<RestApiResponse<models::GetRateHistoryResponse>> {
3218            if self.force_error {
3219                return Err(ConnectorError::ConnectorClientError {
3220                    msg: "ResponseError".to_string(),
3221                    code: None,
3222                }
3223                .into());
3224            }
3225
3226            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!({}));
3227            let dummy_response: models::GetRateHistoryResponse =
3228                serde_json::from_value(resp_json.clone())
3229                    .expect("should parse into models::GetRateHistoryResponse");
3230
3231            let dummy = DummyRestApiResponse {
3232                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3233                status: 200,
3234                headers: HashMap::new(),
3235                rate_limits: None,
3236            };
3237
3238            Ok(dummy.into())
3239        }
3240
3241        async fn get_simple_earn_flexible_product_list(
3242            &self,
3243            _params: GetSimpleEarnFlexibleProductListParams,
3244        ) -> anyhow::Result<RestApiResponse<models::GetSimpleEarnFlexibleProductListResponse>>
3245        {
3246            if self.force_error {
3247                return Err(ConnectorError::ConnectorClientError {
3248                    msg: "ResponseError".to_string(),
3249                    code: None,
3250                }
3251                .into());
3252            }
3253
3254            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!({}));
3255            let dummy_response: models::GetSimpleEarnFlexibleProductListResponse =
3256                serde_json::from_value(resp_json.clone())
3257                    .expect("should parse into models::GetSimpleEarnFlexibleProductListResponse");
3258
3259            let dummy = DummyRestApiResponse {
3260                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3261                status: 200,
3262                headers: HashMap::new(),
3263                rate_limits: None,
3264            };
3265
3266            Ok(dummy.into())
3267        }
3268
3269        async fn get_simple_earn_locked_product_list(
3270            &self,
3271            _params: GetSimpleEarnLockedProductListParams,
3272        ) -> anyhow::Result<RestApiResponse<models::GetSimpleEarnLockedProductListResponse>>
3273        {
3274            if self.force_error {
3275                return Err(ConnectorError::ConnectorClientError {
3276                    msg: "ResponseError".to_string(),
3277                    code: None,
3278                }
3279                .into());
3280            }
3281
3282            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!({}));
3283            let dummy_response: models::GetSimpleEarnLockedProductListResponse =
3284                serde_json::from_value(resp_json.clone())
3285                    .expect("should parse into models::GetSimpleEarnLockedProductListResponse");
3286
3287            let dummy = DummyRestApiResponse {
3288                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3289                status: 200,
3290                headers: HashMap::new(),
3291                rate_limits: None,
3292            };
3293
3294            Ok(dummy.into())
3295        }
3296
3297        async fn redeem_flexible_product(
3298            &self,
3299            _params: RedeemFlexibleProductParams,
3300        ) -> anyhow::Result<RestApiResponse<models::RedeemFlexibleProductResponse>> {
3301            if self.force_error {
3302                return Err(ConnectorError::ConnectorClientError {
3303                    msg: "ResponseError".to_string(),
3304                    code: None,
3305                }
3306                .into());
3307            }
3308
3309            let resp_json: Value = serde_json::from_str(r#"{"redeemId":40607,"success":true}"#)
3310                .unwrap_or_else(|_| serde_json::json!({}));
3311            let dummy_response: models::RedeemFlexibleProductResponse =
3312                serde_json::from_value(resp_json.clone())
3313                    .expect("should parse into models::RedeemFlexibleProductResponse");
3314
3315            let dummy = DummyRestApiResponse {
3316                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3317                status: 200,
3318                headers: HashMap::new(),
3319                rate_limits: None,
3320            };
3321
3322            Ok(dummy.into())
3323        }
3324
3325        async fn redeem_locked_product(
3326            &self,
3327            _params: RedeemLockedProductParams,
3328        ) -> anyhow::Result<RestApiResponse<models::RedeemLockedProductResponse>> {
3329            if self.force_error {
3330                return Err(ConnectorError::ConnectorClientError {
3331                    msg: "ResponseError".to_string(),
3332                    code: None,
3333                }
3334                .into());
3335            }
3336
3337            let resp_json: Value = serde_json::from_str(r#"{"redeemId":40607,"success":true}"#)
3338                .unwrap_or_else(|_| serde_json::json!({}));
3339            let dummy_response: models::RedeemLockedProductResponse =
3340                serde_json::from_value(resp_json.clone())
3341                    .expect("should parse into models::RedeemLockedProductResponse");
3342
3343            let dummy = DummyRestApiResponse {
3344                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3345                status: 200,
3346                headers: HashMap::new(),
3347                rate_limits: None,
3348            };
3349
3350            Ok(dummy.into())
3351        }
3352
3353        async fn set_flexible_auto_subscribe(
3354            &self,
3355            _params: SetFlexibleAutoSubscribeParams,
3356        ) -> anyhow::Result<RestApiResponse<models::SetFlexibleAutoSubscribeResponse>> {
3357            if self.force_error {
3358                return Err(ConnectorError::ConnectorClientError {
3359                    msg: "ResponseError".to_string(),
3360                    code: None,
3361                }
3362                .into());
3363            }
3364
3365            let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
3366                .unwrap_or_else(|_| serde_json::json!({}));
3367            let dummy_response: models::SetFlexibleAutoSubscribeResponse =
3368                serde_json::from_value(resp_json.clone())
3369                    .expect("should parse into models::SetFlexibleAutoSubscribeResponse");
3370
3371            let dummy = DummyRestApiResponse {
3372                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3373                status: 200,
3374                headers: HashMap::new(),
3375                rate_limits: None,
3376            };
3377
3378            Ok(dummy.into())
3379        }
3380
3381        async fn set_locked_auto_subscribe(
3382            &self,
3383            _params: SetLockedAutoSubscribeParams,
3384        ) -> anyhow::Result<RestApiResponse<models::SetLockedAutoSubscribeResponse>> {
3385            if self.force_error {
3386                return Err(ConnectorError::ConnectorClientError {
3387                    msg: "ResponseError".to_string(),
3388                    code: None,
3389                }
3390                .into());
3391            }
3392
3393            let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
3394                .unwrap_or_else(|_| serde_json::json!({}));
3395            let dummy_response: models::SetLockedAutoSubscribeResponse =
3396                serde_json::from_value(resp_json.clone())
3397                    .expect("should parse into models::SetLockedAutoSubscribeResponse");
3398
3399            let dummy = DummyRestApiResponse {
3400                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3401                status: 200,
3402                headers: HashMap::new(),
3403                rate_limits: None,
3404            };
3405
3406            Ok(dummy.into())
3407        }
3408
3409        async fn set_locked_product_redeem_option(
3410            &self,
3411            _params: SetLockedProductRedeemOptionParams,
3412        ) -> anyhow::Result<RestApiResponse<models::SetLockedProductRedeemOptionResponse>> {
3413            if self.force_error {
3414                return Err(ConnectorError::ConnectorClientError {
3415                    msg: "ResponseError".to_string(),
3416                    code: None,
3417                }
3418                .into());
3419            }
3420
3421            let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
3422                .unwrap_or_else(|_| serde_json::json!({}));
3423            let dummy_response: models::SetLockedProductRedeemOptionResponse =
3424                serde_json::from_value(resp_json.clone())
3425                    .expect("should parse into models::SetLockedProductRedeemOptionResponse");
3426
3427            let dummy = DummyRestApiResponse {
3428                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3429                status: 200,
3430                headers: HashMap::new(),
3431                rate_limits: None,
3432            };
3433
3434            Ok(dummy.into())
3435        }
3436
3437        async fn simple_account(
3438            &self,
3439            _params: SimpleAccountParams,
3440        ) -> anyhow::Result<RestApiResponse<models::SimpleAccountResponse>> {
3441            if self.force_error {
3442                return Err(ConnectorError::ConnectorClientError {
3443                    msg: "ResponseError".to_string(),
3444                    code: None,
3445                }
3446                .into());
3447            }
3448
3449            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!({}));
3450            let dummy_response: models::SimpleAccountResponse =
3451                serde_json::from_value(resp_json.clone())
3452                    .expect("should parse into models::SimpleAccountResponse");
3453
3454            let dummy = DummyRestApiResponse {
3455                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3456                status: 200,
3457                headers: HashMap::new(),
3458                rate_limits: None,
3459            };
3460
3461            Ok(dummy.into())
3462        }
3463
3464        async fn subscribe_flexible_product(
3465            &self,
3466            _params: SubscribeFlexibleProductParams,
3467        ) -> anyhow::Result<RestApiResponse<models::SubscribeFlexibleProductResponse>> {
3468            if self.force_error {
3469                return Err(ConnectorError::ConnectorClientError {
3470                    msg: "ResponseError".to_string(),
3471                    code: None,
3472                }
3473                .into());
3474            }
3475
3476            let resp_json: Value = serde_json::from_str(r#"{"purchaseId":40607,"success":true}"#)
3477                .unwrap_or_else(|_| serde_json::json!({}));
3478            let dummy_response: models::SubscribeFlexibleProductResponse =
3479                serde_json::from_value(resp_json.clone())
3480                    .expect("should parse into models::SubscribeFlexibleProductResponse");
3481
3482            let dummy = DummyRestApiResponse {
3483                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3484                status: 200,
3485                headers: HashMap::new(),
3486                rate_limits: None,
3487            };
3488
3489            Ok(dummy.into())
3490        }
3491
3492        async fn subscribe_locked_product(
3493            &self,
3494            _params: SubscribeLockedProductParams,
3495        ) -> anyhow::Result<RestApiResponse<models::SubscribeLockedProductResponse>> {
3496            if self.force_error {
3497                return Err(ConnectorError::ConnectorClientError {
3498                    msg: "ResponseError".to_string(),
3499                    code: None,
3500                }
3501                .into());
3502            }
3503
3504            let resp_json: Value =
3505                serde_json::from_str(r#"{"purchaseId":40607,"positionId":"12345","success":true}"#)
3506                    .unwrap_or_else(|_| serde_json::json!({}));
3507            let dummy_response: models::SubscribeLockedProductResponse =
3508                serde_json::from_value(resp_json.clone())
3509                    .expect("should parse into models::SubscribeLockedProductResponse");
3510
3511            let dummy = DummyRestApiResponse {
3512                inner: Box::new(move || Box::pin(async move { Ok(dummy_response) })),
3513                status: 200,
3514                headers: HashMap::new(),
3515                rate_limits: None,
3516            };
3517
3518            Ok(dummy.into())
3519        }
3520    }
3521
3522    #[test]
3523    fn get_collateral_record_required_params_success() {
3524        TOKIO_SHARED_RT.block_on(async {
3525            let client = MockFlexibleLockedApiClient { force_error: false };
3526
3527            let params = GetCollateralRecordParams::builder().build().unwrap();
3528
3529            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!({}));
3530            let expected_response : models::GetCollateralRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetCollateralRecordResponse");
3531
3532            let resp = client.get_collateral_record(params).await.expect("Expected a response");
3533            let data_future = resp.data();
3534            let actual_response = data_future.await.unwrap();
3535            assert_eq!(actual_response, expected_response);
3536        });
3537    }
3538
3539    #[test]
3540    fn get_collateral_record_optional_params_success() {
3541        TOKIO_SHARED_RT.block_on(async {
3542            let client = MockFlexibleLockedApiClient { force_error: false };
3543
3544            let params = GetCollateralRecordParams::builder().product_id("1".to_string()).start_time(1623319461670).end_time(1641782889000).current(1).size(10).recv_window(5000).build().unwrap();
3545
3546            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!({}));
3547            let expected_response : models::GetCollateralRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetCollateralRecordResponse");
3548
3549            let resp = client.get_collateral_record(params).await.expect("Expected a response");
3550            let data_future = resp.data();
3551            let actual_response = data_future.await.unwrap();
3552            assert_eq!(actual_response, expected_response);
3553        });
3554    }
3555
3556    #[test]
3557    fn get_collateral_record_response_error() {
3558        TOKIO_SHARED_RT.block_on(async {
3559            let client = MockFlexibleLockedApiClient { force_error: true };
3560
3561            let params = GetCollateralRecordParams::builder().build().unwrap();
3562
3563            match client.get_collateral_record(params).await {
3564                Ok(_) => panic!("Expected an error"),
3565                Err(err) => {
3566                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
3567                }
3568            }
3569        });
3570    }
3571
3572    #[test]
3573    fn get_flexible_personal_left_quota_required_params_success() {
3574        TOKIO_SHARED_RT.block_on(async {
3575            let client = MockFlexibleLockedApiClient { force_error: false };
3576
3577            let params = GetFlexiblePersonalLeftQuotaParams::builder("1".to_string())
3578                .build()
3579                .unwrap();
3580
3581            let resp_json: Value = serde_json::from_str(r#"{"leftPersonalQuota":"1000"}"#)
3582                .unwrap_or_else(|_| serde_json::json!({}));
3583            let expected_response: models::GetFlexiblePersonalLeftQuotaResponse =
3584                serde_json::from_value(resp_json.clone())
3585                    .expect("should parse into models::GetFlexiblePersonalLeftQuotaResponse");
3586
3587            let resp = client
3588                .get_flexible_personal_left_quota(params)
3589                .await
3590                .expect("Expected a response");
3591            let data_future = resp.data();
3592            let actual_response = data_future.await.unwrap();
3593            assert_eq!(actual_response, expected_response);
3594        });
3595    }
3596
3597    #[test]
3598    fn get_flexible_personal_left_quota_optional_params_success() {
3599        TOKIO_SHARED_RT.block_on(async {
3600            let client = MockFlexibleLockedApiClient { force_error: false };
3601
3602            let params = GetFlexiblePersonalLeftQuotaParams::builder("1".to_string())
3603                .recv_window(5000)
3604                .build()
3605                .unwrap();
3606
3607            let resp_json: Value = serde_json::from_str(r#"{"leftPersonalQuota":"1000"}"#)
3608                .unwrap_or_else(|_| serde_json::json!({}));
3609            let expected_response: models::GetFlexiblePersonalLeftQuotaResponse =
3610                serde_json::from_value(resp_json.clone())
3611                    .expect("should parse into models::GetFlexiblePersonalLeftQuotaResponse");
3612
3613            let resp = client
3614                .get_flexible_personal_left_quota(params)
3615                .await
3616                .expect("Expected a response");
3617            let data_future = resp.data();
3618            let actual_response = data_future.await.unwrap();
3619            assert_eq!(actual_response, expected_response);
3620        });
3621    }
3622
3623    #[test]
3624    fn get_flexible_personal_left_quota_response_error() {
3625        TOKIO_SHARED_RT.block_on(async {
3626            let client = MockFlexibleLockedApiClient { force_error: true };
3627
3628            let params = GetFlexiblePersonalLeftQuotaParams::builder("1".to_string())
3629                .build()
3630                .unwrap();
3631
3632            match client.get_flexible_personal_left_quota(params).await {
3633                Ok(_) => panic!("Expected an error"),
3634                Err(err) => {
3635                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
3636                }
3637            }
3638        });
3639    }
3640
3641    #[test]
3642    fn get_flexible_product_position_required_params_success() {
3643        TOKIO_SHARED_RT.block_on(async {
3644            let client = MockFlexibleLockedApiClient { force_error: false };
3645
3646            let params = GetFlexibleProductPositionParams::builder().build().unwrap();
3647
3648            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!({}));
3649            let expected_response : models::GetFlexibleProductPositionResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleProductPositionResponse");
3650
3651            let resp = client.get_flexible_product_position(params).await.expect("Expected a response");
3652            let data_future = resp.data();
3653            let actual_response = data_future.await.unwrap();
3654            assert_eq!(actual_response, expected_response);
3655        });
3656    }
3657
3658    #[test]
3659    fn get_flexible_product_position_optional_params_success() {
3660        TOKIO_SHARED_RT.block_on(async {
3661            let client = MockFlexibleLockedApiClient { force_error: false };
3662
3663            let params = GetFlexibleProductPositionParams::builder().asset("USDC".to_string()).product_id("1".to_string()).current(1).size(10).recv_window(5000).build().unwrap();
3664
3665            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!({}));
3666            let expected_response : models::GetFlexibleProductPositionResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleProductPositionResponse");
3667
3668            let resp = client.get_flexible_product_position(params).await.expect("Expected a response");
3669            let data_future = resp.data();
3670            let actual_response = data_future.await.unwrap();
3671            assert_eq!(actual_response, expected_response);
3672        });
3673    }
3674
3675    #[test]
3676    fn get_flexible_product_position_response_error() {
3677        TOKIO_SHARED_RT.block_on(async {
3678            let client = MockFlexibleLockedApiClient { force_error: true };
3679
3680            let params = GetFlexibleProductPositionParams::builder().build().unwrap();
3681
3682            match client.get_flexible_product_position(params).await {
3683                Ok(_) => panic!("Expected an error"),
3684                Err(err) => {
3685                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
3686                }
3687            }
3688        });
3689    }
3690
3691    #[test]
3692    fn get_flexible_redemption_record_required_params_success() {
3693        TOKIO_SHARED_RT.block_on(async {
3694            let client = MockFlexibleLockedApiClient { force_error: false };
3695
3696            let params = GetFlexibleRedemptionRecordParams::builder().build().unwrap();
3697
3698            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!({}));
3699            let expected_response : models::GetFlexibleRedemptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleRedemptionRecordResponse");
3700
3701            let resp = client.get_flexible_redemption_record(params).await.expect("Expected a response");
3702            let data_future = resp.data();
3703            let actual_response = data_future.await.unwrap();
3704            assert_eq!(actual_response, expected_response);
3705        });
3706    }
3707
3708    #[test]
3709    fn get_flexible_redemption_record_optional_params_success() {
3710        TOKIO_SHARED_RT.block_on(async {
3711            let client = MockFlexibleLockedApiClient { force_error: false };
3712
3713            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();
3714
3715            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!({}));
3716            let expected_response : models::GetFlexibleRedemptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleRedemptionRecordResponse");
3717
3718            let resp = client.get_flexible_redemption_record(params).await.expect("Expected a response");
3719            let data_future = resp.data();
3720            let actual_response = data_future.await.unwrap();
3721            assert_eq!(actual_response, expected_response);
3722        });
3723    }
3724
3725    #[test]
3726    fn get_flexible_redemption_record_response_error() {
3727        TOKIO_SHARED_RT.block_on(async {
3728            let client = MockFlexibleLockedApiClient { force_error: true };
3729
3730            let params = GetFlexibleRedemptionRecordParams::builder()
3731                .build()
3732                .unwrap();
3733
3734            match client.get_flexible_redemption_record(params).await {
3735                Ok(_) => panic!("Expected an error"),
3736                Err(err) => {
3737                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
3738                }
3739            }
3740        });
3741    }
3742
3743    #[test]
3744    fn get_flexible_rewards_history_required_params_success() {
3745        TOKIO_SHARED_RT.block_on(async {
3746            let client = MockFlexibleLockedApiClient { force_error: false };
3747
3748            let params = GetFlexibleRewardsHistoryParams::builder().build().unwrap();
3749
3750            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!({}));
3751            let expected_response : models::GetFlexibleRewardsHistoryResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleRewardsHistoryResponse");
3752
3753            let resp = client.get_flexible_rewards_history(params).await.expect("Expected a response");
3754            let data_future = resp.data();
3755            let actual_response = data_future.await.unwrap();
3756            assert_eq!(actual_response, expected_response);
3757        });
3758    }
3759
3760    #[test]
3761    fn get_flexible_rewards_history_optional_params_success() {
3762        TOKIO_SHARED_RT.block_on(async {
3763            let client = MockFlexibleLockedApiClient { force_error: false };
3764
3765            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();
3766
3767            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!({}));
3768            let expected_response : models::GetFlexibleRewardsHistoryResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleRewardsHistoryResponse");
3769
3770            let resp = client.get_flexible_rewards_history(params).await.expect("Expected a response");
3771            let data_future = resp.data();
3772            let actual_response = data_future.await.unwrap();
3773            assert_eq!(actual_response, expected_response);
3774        });
3775    }
3776
3777    #[test]
3778    fn get_flexible_rewards_history_response_error() {
3779        TOKIO_SHARED_RT.block_on(async {
3780            let client = MockFlexibleLockedApiClient { force_error: true };
3781
3782            let params = GetFlexibleRewardsHistoryParams::builder().build().unwrap();
3783
3784            match client.get_flexible_rewards_history(params).await {
3785                Ok(_) => panic!("Expected an error"),
3786                Err(err) => {
3787                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
3788                }
3789            }
3790        });
3791    }
3792
3793    #[test]
3794    fn get_flexible_subscription_preview_required_params_success() {
3795        TOKIO_SHARED_RT.block_on(async {
3796            let client = MockFlexibleLockedApiClient { force_error: false };
3797
3798            let params = GetFlexibleSubscriptionPreviewParams::builder("1".to_string(),dec!(1.0),).build().unwrap();
3799
3800            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!({}));
3801            let expected_response : models::GetFlexibleSubscriptionPreviewResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleSubscriptionPreviewResponse");
3802
3803            let resp = client.get_flexible_subscription_preview(params).await.expect("Expected a response");
3804            let data_future = resp.data();
3805            let actual_response = data_future.await.unwrap();
3806            assert_eq!(actual_response, expected_response);
3807        });
3808    }
3809
3810    #[test]
3811    fn get_flexible_subscription_preview_optional_params_success() {
3812        TOKIO_SHARED_RT.block_on(async {
3813            let client = MockFlexibleLockedApiClient { force_error: false };
3814
3815            let params = GetFlexibleSubscriptionPreviewParams::builder("1".to_string(),dec!(1.0),).recv_window(5000).build().unwrap();
3816
3817            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!({}));
3818            let expected_response : models::GetFlexibleSubscriptionPreviewResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleSubscriptionPreviewResponse");
3819
3820            let resp = client.get_flexible_subscription_preview(params).await.expect("Expected a response");
3821            let data_future = resp.data();
3822            let actual_response = data_future.await.unwrap();
3823            assert_eq!(actual_response, expected_response);
3824        });
3825    }
3826
3827    #[test]
3828    fn get_flexible_subscription_preview_response_error() {
3829        TOKIO_SHARED_RT.block_on(async {
3830            let client = MockFlexibleLockedApiClient { force_error: true };
3831
3832            let params = GetFlexibleSubscriptionPreviewParams::builder("1".to_string(), dec!(1.0))
3833                .build()
3834                .unwrap();
3835
3836            match client.get_flexible_subscription_preview(params).await {
3837                Ok(_) => panic!("Expected an error"),
3838                Err(err) => {
3839                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
3840                }
3841            }
3842        });
3843    }
3844
3845    #[test]
3846    fn get_flexible_subscription_record_required_params_success() {
3847        TOKIO_SHARED_RT.block_on(async {
3848            let client = MockFlexibleLockedApiClient { force_error: false };
3849
3850            let params = GetFlexibleSubscriptionRecordParams::builder().build().unwrap();
3851
3852            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!({}));
3853            let expected_response : models::GetFlexibleSubscriptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleSubscriptionRecordResponse");
3854
3855            let resp = client.get_flexible_subscription_record(params).await.expect("Expected a response");
3856            let data_future = resp.data();
3857            let actual_response = data_future.await.unwrap();
3858            assert_eq!(actual_response, expected_response);
3859        });
3860    }
3861
3862    #[test]
3863    fn get_flexible_subscription_record_optional_params_success() {
3864        TOKIO_SHARED_RT.block_on(async {
3865            let client = MockFlexibleLockedApiClient { force_error: false };
3866
3867            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();
3868
3869            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!({}));
3870            let expected_response : models::GetFlexibleSubscriptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetFlexibleSubscriptionRecordResponse");
3871
3872            let resp = client.get_flexible_subscription_record(params).await.expect("Expected a response");
3873            let data_future = resp.data();
3874            let actual_response = data_future.await.unwrap();
3875            assert_eq!(actual_response, expected_response);
3876        });
3877    }
3878
3879    #[test]
3880    fn get_flexible_subscription_record_response_error() {
3881        TOKIO_SHARED_RT.block_on(async {
3882            let client = MockFlexibleLockedApiClient { force_error: true };
3883
3884            let params = GetFlexibleSubscriptionRecordParams::builder()
3885                .build()
3886                .unwrap();
3887
3888            match client.get_flexible_subscription_record(params).await {
3889                Ok(_) => panic!("Expected an error"),
3890                Err(err) => {
3891                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
3892                }
3893            }
3894        });
3895    }
3896
3897    #[test]
3898    fn get_locked_personal_left_quota_required_params_success() {
3899        TOKIO_SHARED_RT.block_on(async {
3900            let client = MockFlexibleLockedApiClient { force_error: false };
3901
3902            let params = GetLockedPersonalLeftQuotaParams::builder("1".to_string())
3903                .build()
3904                .unwrap();
3905
3906            let resp_json: Value = serde_json::from_str(r#"{"leftPersonalQuota":"1000"}"#)
3907                .unwrap_or_else(|_| serde_json::json!({}));
3908            let expected_response: models::GetLockedPersonalLeftQuotaResponse =
3909                serde_json::from_value(resp_json.clone())
3910                    .expect("should parse into models::GetLockedPersonalLeftQuotaResponse");
3911
3912            let resp = client
3913                .get_locked_personal_left_quota(params)
3914                .await
3915                .expect("Expected a response");
3916            let data_future = resp.data();
3917            let actual_response = data_future.await.unwrap();
3918            assert_eq!(actual_response, expected_response);
3919        });
3920    }
3921
3922    #[test]
3923    fn get_locked_personal_left_quota_optional_params_success() {
3924        TOKIO_SHARED_RT.block_on(async {
3925            let client = MockFlexibleLockedApiClient { force_error: false };
3926
3927            let params = GetLockedPersonalLeftQuotaParams::builder("1".to_string())
3928                .recv_window(5000)
3929                .build()
3930                .unwrap();
3931
3932            let resp_json: Value = serde_json::from_str(r#"{"leftPersonalQuota":"1000"}"#)
3933                .unwrap_or_else(|_| serde_json::json!({}));
3934            let expected_response: models::GetLockedPersonalLeftQuotaResponse =
3935                serde_json::from_value(resp_json.clone())
3936                    .expect("should parse into models::GetLockedPersonalLeftQuotaResponse");
3937
3938            let resp = client
3939                .get_locked_personal_left_quota(params)
3940                .await
3941                .expect("Expected a response");
3942            let data_future = resp.data();
3943            let actual_response = data_future.await.unwrap();
3944            assert_eq!(actual_response, expected_response);
3945        });
3946    }
3947
3948    #[test]
3949    fn get_locked_personal_left_quota_response_error() {
3950        TOKIO_SHARED_RT.block_on(async {
3951            let client = MockFlexibleLockedApiClient { force_error: true };
3952
3953            let params = GetLockedPersonalLeftQuotaParams::builder("1".to_string())
3954                .build()
3955                .unwrap();
3956
3957            match client.get_locked_personal_left_quota(params).await {
3958                Ok(_) => panic!("Expected an error"),
3959                Err(err) => {
3960                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
3961                }
3962            }
3963        });
3964    }
3965
3966    #[test]
3967    fn get_locked_product_position_required_params_success() {
3968        TOKIO_SHARED_RT.block_on(async {
3969            let client = MockFlexibleLockedApiClient { force_error: false };
3970
3971            let params = GetLockedProductPositionParams::builder().build().unwrap();
3972
3973            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!({}));
3974            let expected_response : models::GetLockedProductPositionResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetLockedProductPositionResponse");
3975
3976            let resp = client.get_locked_product_position(params).await.expect("Expected a response");
3977            let data_future = resp.data();
3978            let actual_response = data_future.await.unwrap();
3979            assert_eq!(actual_response, expected_response);
3980        });
3981    }
3982
3983    #[test]
3984    fn get_locked_product_position_optional_params_success() {
3985        TOKIO_SHARED_RT.block_on(async {
3986            let client = MockFlexibleLockedApiClient { force_error: false };
3987
3988            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();
3989
3990            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!({}));
3991            let expected_response : models::GetLockedProductPositionResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetLockedProductPositionResponse");
3992
3993            let resp = client.get_locked_product_position(params).await.expect("Expected a response");
3994            let data_future = resp.data();
3995            let actual_response = data_future.await.unwrap();
3996            assert_eq!(actual_response, expected_response);
3997        });
3998    }
3999
4000    #[test]
4001    fn get_locked_product_position_response_error() {
4002        TOKIO_SHARED_RT.block_on(async {
4003            let client = MockFlexibleLockedApiClient { force_error: true };
4004
4005            let params = GetLockedProductPositionParams::builder().build().unwrap();
4006
4007            match client.get_locked_product_position(params).await {
4008                Ok(_) => panic!("Expected an error"),
4009                Err(err) => {
4010                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
4011                }
4012            }
4013        });
4014    }
4015
4016    #[test]
4017    fn get_locked_redemption_record_required_params_success() {
4018        TOKIO_SHARED_RT.block_on(async {
4019            let client = MockFlexibleLockedApiClient { force_error: false };
4020
4021            let params = GetLockedRedemptionRecordParams::builder().build().unwrap();
4022
4023            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!({}));
4024            let expected_response : models::GetLockedRedemptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetLockedRedemptionRecordResponse");
4025
4026            let resp = client.get_locked_redemption_record(params).await.expect("Expected a response");
4027            let data_future = resp.data();
4028            let actual_response = data_future.await.unwrap();
4029            assert_eq!(actual_response, expected_response);
4030        });
4031    }
4032
4033    #[test]
4034    fn get_locked_redemption_record_optional_params_success() {
4035        TOKIO_SHARED_RT.block_on(async {
4036            let client = MockFlexibleLockedApiClient { force_error: false };
4037
4038            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();
4039
4040            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!({}));
4041            let expected_response : models::GetLockedRedemptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetLockedRedemptionRecordResponse");
4042
4043            let resp = client.get_locked_redemption_record(params).await.expect("Expected a response");
4044            let data_future = resp.data();
4045            let actual_response = data_future.await.unwrap();
4046            assert_eq!(actual_response, expected_response);
4047        });
4048    }
4049
4050    #[test]
4051    fn get_locked_redemption_record_response_error() {
4052        TOKIO_SHARED_RT.block_on(async {
4053            let client = MockFlexibleLockedApiClient { force_error: true };
4054
4055            let params = GetLockedRedemptionRecordParams::builder().build().unwrap();
4056
4057            match client.get_locked_redemption_record(params).await {
4058                Ok(_) => panic!("Expected an error"),
4059                Err(err) => {
4060                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
4061                }
4062            }
4063        });
4064    }
4065
4066    #[test]
4067    fn get_locked_rewards_history_required_params_success() {
4068        TOKIO_SHARED_RT.block_on(async {
4069            let client = MockFlexibleLockedApiClient { force_error: false };
4070
4071            let params = GetLockedRewardsHistoryParams::builder().build().unwrap();
4072
4073            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!({}));
4074            let expected_response : models::GetLockedRewardsHistoryResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetLockedRewardsHistoryResponse");
4075
4076            let resp = client.get_locked_rewards_history(params).await.expect("Expected a response");
4077            let data_future = resp.data();
4078            let actual_response = data_future.await.unwrap();
4079            assert_eq!(actual_response, expected_response);
4080        });
4081    }
4082
4083    #[test]
4084    fn get_locked_rewards_history_optional_params_success() {
4085        TOKIO_SHARED_RT.block_on(async {
4086            let client = MockFlexibleLockedApiClient { force_error: false };
4087
4088            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();
4089
4090            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!({}));
4091            let expected_response : models::GetLockedRewardsHistoryResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetLockedRewardsHistoryResponse");
4092
4093            let resp = client.get_locked_rewards_history(params).await.expect("Expected a response");
4094            let data_future = resp.data();
4095            let actual_response = data_future.await.unwrap();
4096            assert_eq!(actual_response, expected_response);
4097        });
4098    }
4099
4100    #[test]
4101    fn get_locked_rewards_history_response_error() {
4102        TOKIO_SHARED_RT.block_on(async {
4103            let client = MockFlexibleLockedApiClient { force_error: true };
4104
4105            let params = GetLockedRewardsHistoryParams::builder().build().unwrap();
4106
4107            match client.get_locked_rewards_history(params).await {
4108                Ok(_) => panic!("Expected an error"),
4109                Err(err) => {
4110                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
4111                }
4112            }
4113        });
4114    }
4115
4116    #[test]
4117    fn get_locked_subscription_preview_required_params_success() {
4118        TOKIO_SHARED_RT.block_on(async {
4119            let client = MockFlexibleLockedApiClient { force_error: false };
4120
4121            let params = GetLockedSubscriptionPreviewParams::builder("1".to_string(),dec!(1.0),).build().unwrap();
4122
4123            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!({}));
4124            let expected_response : Vec<models::GetLockedSubscriptionPreviewResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::GetLockedSubscriptionPreviewResponseInner>");
4125
4126            let resp = client.get_locked_subscription_preview(params).await.expect("Expected a response");
4127            let data_future = resp.data();
4128            let actual_response = data_future.await.unwrap();
4129            assert_eq!(actual_response, expected_response);
4130        });
4131    }
4132
4133    #[test]
4134    fn get_locked_subscription_preview_optional_params_success() {
4135        TOKIO_SHARED_RT.block_on(async {
4136            let client = MockFlexibleLockedApiClient { force_error: false };
4137
4138            let params = GetLockedSubscriptionPreviewParams::builder("1".to_string(),dec!(1.0),).auto_subscribe(true).recv_window(5000).build().unwrap();
4139
4140            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!({}));
4141            let expected_response : Vec<models::GetLockedSubscriptionPreviewResponseInner> = serde_json::from_value(resp_json.clone()).expect("should parse into Vec<models::GetLockedSubscriptionPreviewResponseInner>");
4142
4143            let resp = client.get_locked_subscription_preview(params).await.expect("Expected a response");
4144            let data_future = resp.data();
4145            let actual_response = data_future.await.unwrap();
4146            assert_eq!(actual_response, expected_response);
4147        });
4148    }
4149
4150    #[test]
4151    fn get_locked_subscription_preview_response_error() {
4152        TOKIO_SHARED_RT.block_on(async {
4153            let client = MockFlexibleLockedApiClient { force_error: true };
4154
4155            let params = GetLockedSubscriptionPreviewParams::builder("1".to_string(), dec!(1.0))
4156                .build()
4157                .unwrap();
4158
4159            match client.get_locked_subscription_preview(params).await {
4160                Ok(_) => panic!("Expected an error"),
4161                Err(err) => {
4162                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
4163                }
4164            }
4165        });
4166    }
4167
4168    #[test]
4169    fn get_locked_subscription_record_required_params_success() {
4170        TOKIO_SHARED_RT.block_on(async {
4171            let client = MockFlexibleLockedApiClient { force_error: false };
4172
4173            let params = GetLockedSubscriptionRecordParams::builder().build().unwrap();
4174
4175            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!({}));
4176            let expected_response : models::GetLockedSubscriptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetLockedSubscriptionRecordResponse");
4177
4178            let resp = client.get_locked_subscription_record(params).await.expect("Expected a response");
4179            let data_future = resp.data();
4180            let actual_response = data_future.await.unwrap();
4181            assert_eq!(actual_response, expected_response);
4182        });
4183    }
4184
4185    #[test]
4186    fn get_locked_subscription_record_optional_params_success() {
4187        TOKIO_SHARED_RT.block_on(async {
4188            let client = MockFlexibleLockedApiClient { force_error: false };
4189
4190            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();
4191
4192            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!({}));
4193            let expected_response : models::GetLockedSubscriptionRecordResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetLockedSubscriptionRecordResponse");
4194
4195            let resp = client.get_locked_subscription_record(params).await.expect("Expected a response");
4196            let data_future = resp.data();
4197            let actual_response = data_future.await.unwrap();
4198            assert_eq!(actual_response, expected_response);
4199        });
4200    }
4201
4202    #[test]
4203    fn get_locked_subscription_record_response_error() {
4204        TOKIO_SHARED_RT.block_on(async {
4205            let client = MockFlexibleLockedApiClient { force_error: true };
4206
4207            let params = GetLockedSubscriptionRecordParams::builder()
4208                .build()
4209                .unwrap();
4210
4211            match client.get_locked_subscription_record(params).await {
4212                Ok(_) => panic!("Expected an error"),
4213                Err(err) => {
4214                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
4215                }
4216            }
4217        });
4218    }
4219
4220    #[test]
4221    fn get_rate_history_required_params_success() {
4222        TOKIO_SHARED_RT.block_on(async {
4223            let client = MockFlexibleLockedApiClient { force_error: false };
4224
4225            let params = GetRateHistoryParams::builder("1".to_string(),).build().unwrap();
4226
4227            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!({}));
4228            let expected_response : models::GetRateHistoryResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetRateHistoryResponse");
4229
4230            let resp = client.get_rate_history(params).await.expect("Expected a response");
4231            let data_future = resp.data();
4232            let actual_response = data_future.await.unwrap();
4233            assert_eq!(actual_response, expected_response);
4234        });
4235    }
4236
4237    #[test]
4238    fn get_rate_history_optional_params_success() {
4239        TOKIO_SHARED_RT.block_on(async {
4240            let client = MockFlexibleLockedApiClient { force_error: false };
4241
4242            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();
4243
4244            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!({}));
4245            let expected_response : models::GetRateHistoryResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetRateHistoryResponse");
4246
4247            let resp = client.get_rate_history(params).await.expect("Expected a response");
4248            let data_future = resp.data();
4249            let actual_response = data_future.await.unwrap();
4250            assert_eq!(actual_response, expected_response);
4251        });
4252    }
4253
4254    #[test]
4255    fn get_rate_history_response_error() {
4256        TOKIO_SHARED_RT.block_on(async {
4257            let client = MockFlexibleLockedApiClient { force_error: true };
4258
4259            let params = GetRateHistoryParams::builder("1".to_string())
4260                .build()
4261                .unwrap();
4262
4263            match client.get_rate_history(params).await {
4264                Ok(_) => panic!("Expected an error"),
4265                Err(err) => {
4266                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
4267                }
4268            }
4269        });
4270    }
4271
4272    #[test]
4273    fn get_simple_earn_flexible_product_list_required_params_success() {
4274        TOKIO_SHARED_RT.block_on(async {
4275            let client = MockFlexibleLockedApiClient { force_error: false };
4276
4277            let params = GetSimpleEarnFlexibleProductListParams::builder().build().unwrap();
4278
4279            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!({}));
4280            let expected_response : models::GetSimpleEarnFlexibleProductListResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetSimpleEarnFlexibleProductListResponse");
4281
4282            let resp = client.get_simple_earn_flexible_product_list(params).await.expect("Expected a response");
4283            let data_future = resp.data();
4284            let actual_response = data_future.await.unwrap();
4285            assert_eq!(actual_response, expected_response);
4286        });
4287    }
4288
4289    #[test]
4290    fn get_simple_earn_flexible_product_list_optional_params_success() {
4291        TOKIO_SHARED_RT.block_on(async {
4292            let client = MockFlexibleLockedApiClient { force_error: false };
4293
4294            let params = GetSimpleEarnFlexibleProductListParams::builder().asset("USDC".to_string()).current(1).size(10).recv_window(5000).build().unwrap();
4295
4296            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!({}));
4297            let expected_response : models::GetSimpleEarnFlexibleProductListResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetSimpleEarnFlexibleProductListResponse");
4298
4299            let resp = client.get_simple_earn_flexible_product_list(params).await.expect("Expected a response");
4300            let data_future = resp.data();
4301            let actual_response = data_future.await.unwrap();
4302            assert_eq!(actual_response, expected_response);
4303        });
4304    }
4305
4306    #[test]
4307    fn get_simple_earn_flexible_product_list_response_error() {
4308        TOKIO_SHARED_RT.block_on(async {
4309            let client = MockFlexibleLockedApiClient { force_error: true };
4310
4311            let params = GetSimpleEarnFlexibleProductListParams::builder()
4312                .build()
4313                .unwrap();
4314
4315            match client.get_simple_earn_flexible_product_list(params).await {
4316                Ok(_) => panic!("Expected an error"),
4317                Err(err) => {
4318                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
4319                }
4320            }
4321        });
4322    }
4323
4324    #[test]
4325    fn get_simple_earn_locked_product_list_required_params_success() {
4326        TOKIO_SHARED_RT.block_on(async {
4327            let client = MockFlexibleLockedApiClient { force_error: false };
4328
4329            let params = GetSimpleEarnLockedProductListParams::builder().build().unwrap();
4330
4331            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!({}));
4332            let expected_response : models::GetSimpleEarnLockedProductListResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetSimpleEarnLockedProductListResponse");
4333
4334            let resp = client.get_simple_earn_locked_product_list(params).await.expect("Expected a response");
4335            let data_future = resp.data();
4336            let actual_response = data_future.await.unwrap();
4337            assert_eq!(actual_response, expected_response);
4338        });
4339    }
4340
4341    #[test]
4342    fn get_simple_earn_locked_product_list_optional_params_success() {
4343        TOKIO_SHARED_RT.block_on(async {
4344            let client = MockFlexibleLockedApiClient { force_error: false };
4345
4346            let params = GetSimpleEarnLockedProductListParams::builder().asset("USDC".to_string()).current(1).size(10).recv_window(5000).build().unwrap();
4347
4348            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!({}));
4349            let expected_response : models::GetSimpleEarnLockedProductListResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::GetSimpleEarnLockedProductListResponse");
4350
4351            let resp = client.get_simple_earn_locked_product_list(params).await.expect("Expected a response");
4352            let data_future = resp.data();
4353            let actual_response = data_future.await.unwrap();
4354            assert_eq!(actual_response, expected_response);
4355        });
4356    }
4357
4358    #[test]
4359    fn get_simple_earn_locked_product_list_response_error() {
4360        TOKIO_SHARED_RT.block_on(async {
4361            let client = MockFlexibleLockedApiClient { force_error: true };
4362
4363            let params = GetSimpleEarnLockedProductListParams::builder()
4364                .build()
4365                .unwrap();
4366
4367            match client.get_simple_earn_locked_product_list(params).await {
4368                Ok(_) => panic!("Expected an error"),
4369                Err(err) => {
4370                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
4371                }
4372            }
4373        });
4374    }
4375
4376    #[test]
4377    fn redeem_flexible_product_required_params_success() {
4378        TOKIO_SHARED_RT.block_on(async {
4379            let client = MockFlexibleLockedApiClient { force_error: false };
4380
4381            let params = RedeemFlexibleProductParams::builder("1".to_string())
4382                .build()
4383                .unwrap();
4384
4385            let resp_json: Value = serde_json::from_str(r#"{"redeemId":40607,"success":true}"#)
4386                .unwrap_or_else(|_| serde_json::json!({}));
4387            let expected_response: models::RedeemFlexibleProductResponse =
4388                serde_json::from_value(resp_json.clone())
4389                    .expect("should parse into models::RedeemFlexibleProductResponse");
4390
4391            let resp = client
4392                .redeem_flexible_product(params)
4393                .await
4394                .expect("Expected a response");
4395            let data_future = resp.data();
4396            let actual_response = data_future.await.unwrap();
4397            assert_eq!(actual_response, expected_response);
4398        });
4399    }
4400
4401    #[test]
4402    fn redeem_flexible_product_optional_params_success() {
4403        TOKIO_SHARED_RT.block_on(async {
4404            let client = MockFlexibleLockedApiClient { force_error: false };
4405
4406            let params = RedeemFlexibleProductParams::builder("1".to_string())
4407                .redeem_all(false)
4408                .amount(dec!(1.0))
4409                .dest_account(RedeemFlexibleProductDestAccountEnum::Spot)
4410                .recv_window(5000)
4411                .build()
4412                .unwrap();
4413
4414            let resp_json: Value = serde_json::from_str(r#"{"redeemId":40607,"success":true}"#)
4415                .unwrap_or_else(|_| serde_json::json!({}));
4416            let expected_response: models::RedeemFlexibleProductResponse =
4417                serde_json::from_value(resp_json.clone())
4418                    .expect("should parse into models::RedeemFlexibleProductResponse");
4419
4420            let resp = client
4421                .redeem_flexible_product(params)
4422                .await
4423                .expect("Expected a response");
4424            let data_future = resp.data();
4425            let actual_response = data_future.await.unwrap();
4426            assert_eq!(actual_response, expected_response);
4427        });
4428    }
4429
4430    #[test]
4431    fn redeem_flexible_product_response_error() {
4432        TOKIO_SHARED_RT.block_on(async {
4433            let client = MockFlexibleLockedApiClient { force_error: true };
4434
4435            let params = RedeemFlexibleProductParams::builder("1".to_string())
4436                .build()
4437                .unwrap();
4438
4439            match client.redeem_flexible_product(params).await {
4440                Ok(_) => panic!("Expected an error"),
4441                Err(err) => {
4442                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
4443                }
4444            }
4445        });
4446    }
4447
4448    #[test]
4449    fn redeem_locked_product_required_params_success() {
4450        TOKIO_SHARED_RT.block_on(async {
4451            let client = MockFlexibleLockedApiClient { force_error: false };
4452
4453            let params = RedeemLockedProductParams::builder("1".to_string())
4454                .build()
4455                .unwrap();
4456
4457            let resp_json: Value = serde_json::from_str(r#"{"redeemId":40607,"success":true}"#)
4458                .unwrap_or_else(|_| serde_json::json!({}));
4459            let expected_response: models::RedeemLockedProductResponse =
4460                serde_json::from_value(resp_json.clone())
4461                    .expect("should parse into models::RedeemLockedProductResponse");
4462
4463            let resp = client
4464                .redeem_locked_product(params)
4465                .await
4466                .expect("Expected a response");
4467            let data_future = resp.data();
4468            let actual_response = data_future.await.unwrap();
4469            assert_eq!(actual_response, expected_response);
4470        });
4471    }
4472
4473    #[test]
4474    fn redeem_locked_product_optional_params_success() {
4475        TOKIO_SHARED_RT.block_on(async {
4476            let client = MockFlexibleLockedApiClient { force_error: false };
4477
4478            let params = RedeemLockedProductParams::builder("1".to_string())
4479                .recv_window(5000)
4480                .build()
4481                .unwrap();
4482
4483            let resp_json: Value = serde_json::from_str(r#"{"redeemId":40607,"success":true}"#)
4484                .unwrap_or_else(|_| serde_json::json!({}));
4485            let expected_response: models::RedeemLockedProductResponse =
4486                serde_json::from_value(resp_json.clone())
4487                    .expect("should parse into models::RedeemLockedProductResponse");
4488
4489            let resp = client
4490                .redeem_locked_product(params)
4491                .await
4492                .expect("Expected a response");
4493            let data_future = resp.data();
4494            let actual_response = data_future.await.unwrap();
4495            assert_eq!(actual_response, expected_response);
4496        });
4497    }
4498
4499    #[test]
4500    fn redeem_locked_product_response_error() {
4501        TOKIO_SHARED_RT.block_on(async {
4502            let client = MockFlexibleLockedApiClient { force_error: true };
4503
4504            let params = RedeemLockedProductParams::builder("1".to_string())
4505                .build()
4506                .unwrap();
4507
4508            match client.redeem_locked_product(params).await {
4509                Ok(_) => panic!("Expected an error"),
4510                Err(err) => {
4511                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
4512                }
4513            }
4514        });
4515    }
4516
4517    #[test]
4518    fn set_flexible_auto_subscribe_required_params_success() {
4519        TOKIO_SHARED_RT.block_on(async {
4520            let client = MockFlexibleLockedApiClient { force_error: false };
4521
4522            let params = SetFlexibleAutoSubscribeParams::builder("1".to_string(), true)
4523                .build()
4524                .unwrap();
4525
4526            let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
4527                .unwrap_or_else(|_| serde_json::json!({}));
4528            let expected_response: models::SetFlexibleAutoSubscribeResponse =
4529                serde_json::from_value(resp_json.clone())
4530                    .expect("should parse into models::SetFlexibleAutoSubscribeResponse");
4531
4532            let resp = client
4533                .set_flexible_auto_subscribe(params)
4534                .await
4535                .expect("Expected a response");
4536            let data_future = resp.data();
4537            let actual_response = data_future.await.unwrap();
4538            assert_eq!(actual_response, expected_response);
4539        });
4540    }
4541
4542    #[test]
4543    fn set_flexible_auto_subscribe_optional_params_success() {
4544        TOKIO_SHARED_RT.block_on(async {
4545            let client = MockFlexibleLockedApiClient { force_error: false };
4546
4547            let params = SetFlexibleAutoSubscribeParams::builder("1".to_string(), true)
4548                .recv_window(5000)
4549                .build()
4550                .unwrap();
4551
4552            let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
4553                .unwrap_or_else(|_| serde_json::json!({}));
4554            let expected_response: models::SetFlexibleAutoSubscribeResponse =
4555                serde_json::from_value(resp_json.clone())
4556                    .expect("should parse into models::SetFlexibleAutoSubscribeResponse");
4557
4558            let resp = client
4559                .set_flexible_auto_subscribe(params)
4560                .await
4561                .expect("Expected a response");
4562            let data_future = resp.data();
4563            let actual_response = data_future.await.unwrap();
4564            assert_eq!(actual_response, expected_response);
4565        });
4566    }
4567
4568    #[test]
4569    fn set_flexible_auto_subscribe_response_error() {
4570        TOKIO_SHARED_RT.block_on(async {
4571            let client = MockFlexibleLockedApiClient { force_error: true };
4572
4573            let params = SetFlexibleAutoSubscribeParams::builder("1".to_string(), true)
4574                .build()
4575                .unwrap();
4576
4577            match client.set_flexible_auto_subscribe(params).await {
4578                Ok(_) => panic!("Expected an error"),
4579                Err(err) => {
4580                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
4581                }
4582            }
4583        });
4584    }
4585
4586    #[test]
4587    fn set_locked_auto_subscribe_required_params_success() {
4588        TOKIO_SHARED_RT.block_on(async {
4589            let client = MockFlexibleLockedApiClient { force_error: false };
4590
4591            let params = SetLockedAutoSubscribeParams::builder("1".to_string(), true)
4592                .build()
4593                .unwrap();
4594
4595            let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
4596                .unwrap_or_else(|_| serde_json::json!({}));
4597            let expected_response: models::SetLockedAutoSubscribeResponse =
4598                serde_json::from_value(resp_json.clone())
4599                    .expect("should parse into models::SetLockedAutoSubscribeResponse");
4600
4601            let resp = client
4602                .set_locked_auto_subscribe(params)
4603                .await
4604                .expect("Expected a response");
4605            let data_future = resp.data();
4606            let actual_response = data_future.await.unwrap();
4607            assert_eq!(actual_response, expected_response);
4608        });
4609    }
4610
4611    #[test]
4612    fn set_locked_auto_subscribe_optional_params_success() {
4613        TOKIO_SHARED_RT.block_on(async {
4614            let client = MockFlexibleLockedApiClient { force_error: false };
4615
4616            let params = SetLockedAutoSubscribeParams::builder("1".to_string(), true)
4617                .recv_window(5000)
4618                .build()
4619                .unwrap();
4620
4621            let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
4622                .unwrap_or_else(|_| serde_json::json!({}));
4623            let expected_response: models::SetLockedAutoSubscribeResponse =
4624                serde_json::from_value(resp_json.clone())
4625                    .expect("should parse into models::SetLockedAutoSubscribeResponse");
4626
4627            let resp = client
4628                .set_locked_auto_subscribe(params)
4629                .await
4630                .expect("Expected a response");
4631            let data_future = resp.data();
4632            let actual_response = data_future.await.unwrap();
4633            assert_eq!(actual_response, expected_response);
4634        });
4635    }
4636
4637    #[test]
4638    fn set_locked_auto_subscribe_response_error() {
4639        TOKIO_SHARED_RT.block_on(async {
4640            let client = MockFlexibleLockedApiClient { force_error: true };
4641
4642            let params = SetLockedAutoSubscribeParams::builder("1".to_string(), true)
4643                .build()
4644                .unwrap();
4645
4646            match client.set_locked_auto_subscribe(params).await {
4647                Ok(_) => panic!("Expected an error"),
4648                Err(err) => {
4649                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
4650                }
4651            }
4652        });
4653    }
4654
4655    #[test]
4656    fn set_locked_product_redeem_option_required_params_success() {
4657        TOKIO_SHARED_RT.block_on(async {
4658            let client = MockFlexibleLockedApiClient { force_error: false };
4659
4660            let params = SetLockedProductRedeemOptionParams::builder(
4661                "1".to_string(),
4662                SetLockedProductRedeemOptionRedeemToEnum::Spot,
4663            )
4664            .build()
4665            .unwrap();
4666
4667            let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
4668                .unwrap_or_else(|_| serde_json::json!({}));
4669            let expected_response: models::SetLockedProductRedeemOptionResponse =
4670                serde_json::from_value(resp_json.clone())
4671                    .expect("should parse into models::SetLockedProductRedeemOptionResponse");
4672
4673            let resp = client
4674                .set_locked_product_redeem_option(params)
4675                .await
4676                .expect("Expected a response");
4677            let data_future = resp.data();
4678            let actual_response = data_future.await.unwrap();
4679            assert_eq!(actual_response, expected_response);
4680        });
4681    }
4682
4683    #[test]
4684    fn set_locked_product_redeem_option_optional_params_success() {
4685        TOKIO_SHARED_RT.block_on(async {
4686            let client = MockFlexibleLockedApiClient { force_error: false };
4687
4688            let params = SetLockedProductRedeemOptionParams::builder(
4689                "1".to_string(),
4690                SetLockedProductRedeemOptionRedeemToEnum::Spot,
4691            )
4692            .recv_window(5000)
4693            .build()
4694            .unwrap();
4695
4696            let resp_json: Value = serde_json::from_str(r#"{"success":true}"#)
4697                .unwrap_or_else(|_| serde_json::json!({}));
4698            let expected_response: models::SetLockedProductRedeemOptionResponse =
4699                serde_json::from_value(resp_json.clone())
4700                    .expect("should parse into models::SetLockedProductRedeemOptionResponse");
4701
4702            let resp = client
4703                .set_locked_product_redeem_option(params)
4704                .await
4705                .expect("Expected a response");
4706            let data_future = resp.data();
4707            let actual_response = data_future.await.unwrap();
4708            assert_eq!(actual_response, expected_response);
4709        });
4710    }
4711
4712    #[test]
4713    fn set_locked_product_redeem_option_response_error() {
4714        TOKIO_SHARED_RT.block_on(async {
4715            let client = MockFlexibleLockedApiClient { force_error: true };
4716
4717            let params = SetLockedProductRedeemOptionParams::builder(
4718                "1".to_string(),
4719                SetLockedProductRedeemOptionRedeemToEnum::Spot,
4720            )
4721            .build()
4722            .unwrap();
4723
4724            match client.set_locked_product_redeem_option(params).await {
4725                Ok(_) => panic!("Expected an error"),
4726                Err(err) => {
4727                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
4728                }
4729            }
4730        });
4731    }
4732
4733    #[test]
4734    fn simple_account_required_params_success() {
4735        TOKIO_SHARED_RT.block_on(async {
4736            let client = MockFlexibleLockedApiClient { force_error: false };
4737
4738            let params = SimpleAccountParams::builder().build().unwrap();
4739
4740            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!({}));
4741            let expected_response : models::SimpleAccountResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::SimpleAccountResponse");
4742
4743            let resp = client.simple_account(params).await.expect("Expected a response");
4744            let data_future = resp.data();
4745            let actual_response = data_future.await.unwrap();
4746            assert_eq!(actual_response, expected_response);
4747        });
4748    }
4749
4750    #[test]
4751    fn simple_account_optional_params_success() {
4752        TOKIO_SHARED_RT.block_on(async {
4753            let client = MockFlexibleLockedApiClient { force_error: false };
4754
4755            let params = SimpleAccountParams::builder().recv_window(5000).build().unwrap();
4756
4757            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!({}));
4758            let expected_response : models::SimpleAccountResponse = serde_json::from_value(resp_json.clone()).expect("should parse into models::SimpleAccountResponse");
4759
4760            let resp = client.simple_account(params).await.expect("Expected a response");
4761            let data_future = resp.data();
4762            let actual_response = data_future.await.unwrap();
4763            assert_eq!(actual_response, expected_response);
4764        });
4765    }
4766
4767    #[test]
4768    fn simple_account_response_error() {
4769        TOKIO_SHARED_RT.block_on(async {
4770            let client = MockFlexibleLockedApiClient { force_error: true };
4771
4772            let params = SimpleAccountParams::builder().build().unwrap();
4773
4774            match client.simple_account(params).await {
4775                Ok(_) => panic!("Expected an error"),
4776                Err(err) => {
4777                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
4778                }
4779            }
4780        });
4781    }
4782
4783    #[test]
4784    fn subscribe_flexible_product_required_params_success() {
4785        TOKIO_SHARED_RT.block_on(async {
4786            let client = MockFlexibleLockedApiClient { force_error: false };
4787
4788            let params = SubscribeFlexibleProductParams::builder("1".to_string(), dec!(1.0))
4789                .build()
4790                .unwrap();
4791
4792            let resp_json: Value = serde_json::from_str(r#"{"purchaseId":40607,"success":true}"#)
4793                .unwrap_or_else(|_| serde_json::json!({}));
4794            let expected_response: models::SubscribeFlexibleProductResponse =
4795                serde_json::from_value(resp_json.clone())
4796                    .expect("should parse into models::SubscribeFlexibleProductResponse");
4797
4798            let resp = client
4799                .subscribe_flexible_product(params)
4800                .await
4801                .expect("Expected a response");
4802            let data_future = resp.data();
4803            let actual_response = data_future.await.unwrap();
4804            assert_eq!(actual_response, expected_response);
4805        });
4806    }
4807
4808    #[test]
4809    fn subscribe_flexible_product_optional_params_success() {
4810        TOKIO_SHARED_RT.block_on(async {
4811            let client = MockFlexibleLockedApiClient { force_error: false };
4812
4813            let params = SubscribeFlexibleProductParams::builder("1".to_string(), dec!(1.0))
4814                .auto_subscribe(true)
4815                .source_account(SubscribeFlexibleProductSourceAccountEnum::Spot)
4816                .recv_window(5000)
4817                .build()
4818                .unwrap();
4819
4820            let resp_json: Value = serde_json::from_str(r#"{"purchaseId":40607,"success":true}"#)
4821                .unwrap_or_else(|_| serde_json::json!({}));
4822            let expected_response: models::SubscribeFlexibleProductResponse =
4823                serde_json::from_value(resp_json.clone())
4824                    .expect("should parse into models::SubscribeFlexibleProductResponse");
4825
4826            let resp = client
4827                .subscribe_flexible_product(params)
4828                .await
4829                .expect("Expected a response");
4830            let data_future = resp.data();
4831            let actual_response = data_future.await.unwrap();
4832            assert_eq!(actual_response, expected_response);
4833        });
4834    }
4835
4836    #[test]
4837    fn subscribe_flexible_product_response_error() {
4838        TOKIO_SHARED_RT.block_on(async {
4839            let client = MockFlexibleLockedApiClient { force_error: true };
4840
4841            let params = SubscribeFlexibleProductParams::builder("1".to_string(), dec!(1.0))
4842                .build()
4843                .unwrap();
4844
4845            match client.subscribe_flexible_product(params).await {
4846                Ok(_) => panic!("Expected an error"),
4847                Err(err) => {
4848                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
4849                }
4850            }
4851        });
4852    }
4853
4854    #[test]
4855    fn subscribe_locked_product_required_params_success() {
4856        TOKIO_SHARED_RT.block_on(async {
4857            let client = MockFlexibleLockedApiClient { force_error: false };
4858
4859            let params = SubscribeLockedProductParams::builder("1".to_string(), dec!(1.0))
4860                .build()
4861                .unwrap();
4862
4863            let resp_json: Value =
4864                serde_json::from_str(r#"{"purchaseId":40607,"positionId":"12345","success":true}"#)
4865                    .unwrap_or_else(|_| serde_json::json!({}));
4866            let expected_response: models::SubscribeLockedProductResponse =
4867                serde_json::from_value(resp_json.clone())
4868                    .expect("should parse into models::SubscribeLockedProductResponse");
4869
4870            let resp = client
4871                .subscribe_locked_product(params)
4872                .await
4873                .expect("Expected a response");
4874            let data_future = resp.data();
4875            let actual_response = data_future.await.unwrap();
4876            assert_eq!(actual_response, expected_response);
4877        });
4878    }
4879
4880    #[test]
4881    fn subscribe_locked_product_optional_params_success() {
4882        TOKIO_SHARED_RT.block_on(async {
4883            let client = MockFlexibleLockedApiClient { force_error: false };
4884
4885            let params = SubscribeLockedProductParams::builder("1".to_string(), dec!(1.0))
4886                .auto_subscribe(false)
4887                .source_account(SubscribeLockedProductSourceAccountEnum::Spot)
4888                .redeem_to(SubscribeLockedProductRedeemToEnum::Spot)
4889                .recv_window(5000)
4890                .build()
4891                .unwrap();
4892
4893            let resp_json: Value =
4894                serde_json::from_str(r#"{"purchaseId":40607,"positionId":"12345","success":true}"#)
4895                    .unwrap_or_else(|_| serde_json::json!({}));
4896            let expected_response: models::SubscribeLockedProductResponse =
4897                serde_json::from_value(resp_json.clone())
4898                    .expect("should parse into models::SubscribeLockedProductResponse");
4899
4900            let resp = client
4901                .subscribe_locked_product(params)
4902                .await
4903                .expect("Expected a response");
4904            let data_future = resp.data();
4905            let actual_response = data_future.await.unwrap();
4906            assert_eq!(actual_response, expected_response);
4907        });
4908    }
4909
4910    #[test]
4911    fn subscribe_locked_product_response_error() {
4912        TOKIO_SHARED_RT.block_on(async {
4913            let client = MockFlexibleLockedApiClient { force_error: true };
4914
4915            let params = SubscribeLockedProductParams::builder("1".to_string(), dec!(1.0))
4916                .build()
4917                .unwrap();
4918
4919            match client.subscribe_locked_product(params).await {
4920                Ok(_) => panic!("Expected an error"),
4921                Err(err) => {
4922                    assert_eq!(err.to_string(), "Connector client error: ResponseError");
4923                }
4924            }
4925        });
4926    }
4927}