1#![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#[derive(Clone, Debug, Builder, Deserialize, Default)]
391#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
392pub struct GetCollateralRecordParams {
393 #[builder(setter(into), default)]
398 #[serde(rename = "productId", default)]
399 pub product_id: Option<String>,
400 #[builder(setter(into), default)]
405 #[serde(rename = "startTime", default)]
406 pub start_time: Option<i64>,
407 #[builder(setter(into), default)]
412 #[serde(rename = "endTime", default)]
413 pub end_time: Option<i64>,
414 #[builder(setter(into), default)]
418 #[serde(rename = "current", default)]
419 pub current: Option<i64>,
420 #[builder(setter(into), default)]
424 #[serde(rename = "size", default)]
425 pub size: Option<i64>,
426 #[builder(setter(into), default)]
430 #[serde(rename = "recvWindow", default)]
431 pub recv_window: Option<i64>,
432}
433
434impl GetCollateralRecordParams {
435 #[must_use]
438 pub fn builder() -> GetCollateralRecordParamsBuilder {
439 GetCollateralRecordParamsBuilder::default()
440 }
441}
442#[derive(Clone, Debug, Builder, Deserialize)]
447#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
448pub struct GetFlexiblePersonalLeftQuotaParams {
449 #[builder(setter(into))]
454 #[serde(rename = "productId")]
455 pub product_id: String,
456 #[builder(setter(into), default)]
460 #[serde(rename = "recvWindow", default)]
461 pub recv_window: Option<i64>,
462}
463
464impl GetFlexiblePersonalLeftQuotaParams {
465 #[must_use]
472 pub fn builder(product_id: String) -> GetFlexiblePersonalLeftQuotaParamsBuilder {
473 GetFlexiblePersonalLeftQuotaParamsBuilder::default().product_id(product_id)
474 }
475}
476#[derive(Clone, Debug, Builder, Deserialize, Default)]
481#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
482pub struct GetFlexibleProductPositionParams {
483 #[builder(setter(into), default)]
488 #[serde(rename = "asset", default)]
489 pub asset: Option<String>,
490 #[builder(setter(into), default)]
495 #[serde(rename = "productId", default)]
496 pub product_id: Option<String>,
497 #[builder(setter(into), default)]
501 #[serde(rename = "current", default)]
502 pub current: Option<i64>,
503 #[builder(setter(into), default)]
507 #[serde(rename = "size", default)]
508 pub size: Option<i64>,
509 #[builder(setter(into), default)]
513 #[serde(rename = "recvWindow", default)]
514 pub recv_window: Option<i64>,
515}
516
517impl GetFlexibleProductPositionParams {
518 #[must_use]
521 pub fn builder() -> GetFlexibleProductPositionParamsBuilder {
522 GetFlexibleProductPositionParamsBuilder::default()
523 }
524}
525#[derive(Clone, Debug, Builder, Deserialize, Default)]
530#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
531pub struct GetFlexibleRedemptionRecordParams {
532 #[builder(setter(into), default)]
537 #[serde(rename = "productId", default)]
538 pub product_id: Option<String>,
539 #[builder(setter(into), default)]
544 #[serde(rename = "redeemId", default)]
545 pub redeem_id: Option<String>,
546 #[builder(setter(into), default)]
551 #[serde(rename = "asset", default)]
552 pub asset: Option<String>,
553 #[builder(setter(into), default)]
558 #[serde(rename = "startTime", default)]
559 pub start_time: Option<i64>,
560 #[builder(setter(into), default)]
565 #[serde(rename = "endTime", default)]
566 pub end_time: Option<i64>,
567 #[builder(setter(into), default)]
571 #[serde(rename = "current", default)]
572 pub current: Option<i64>,
573 #[builder(setter(into), default)]
577 #[serde(rename = "size", default)]
578 pub size: Option<i64>,
579 #[builder(setter(into), default)]
583 #[serde(rename = "recvWindow", default)]
584 pub recv_window: Option<i64>,
585}
586
587impl GetFlexibleRedemptionRecordParams {
588 #[must_use]
591 pub fn builder() -> GetFlexibleRedemptionRecordParamsBuilder {
592 GetFlexibleRedemptionRecordParamsBuilder::default()
593 }
594}
595#[derive(Clone, Debug, Builder, Deserialize, Default)]
600#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
601pub struct GetFlexibleRewardsHistoryParams {
602 #[builder(setter(into), default)]
607 #[serde(rename = "productId", default)]
608 pub product_id: Option<String>,
609 #[builder(setter(into), default)]
614 #[serde(rename = "asset", default)]
615 pub asset: Option<String>,
616 #[builder(setter(into), default)]
621 #[serde(rename = "startTime", default)]
622 pub start_time: Option<i64>,
623 #[builder(setter(into), default)]
628 #[serde(rename = "endTime", default)]
629 pub end_time: Option<i64>,
630 #[builder(setter(into), default)]
634 #[serde(rename = "type", default)]
635 pub r#type: Option<GetFlexibleRewardsHistoryTypeEnum>,
636 #[builder(setter(into), default)]
640 #[serde(rename = "current", default)]
641 pub current: Option<i64>,
642 #[builder(setter(into), default)]
646 #[serde(rename = "size", default)]
647 pub size: Option<i64>,
648 #[builder(setter(into), default)]
652 #[serde(rename = "recvWindow", default)]
653 pub recv_window: Option<i64>,
654}
655
656impl GetFlexibleRewardsHistoryParams {
657 #[must_use]
660 pub fn builder() -> GetFlexibleRewardsHistoryParamsBuilder {
661 GetFlexibleRewardsHistoryParamsBuilder::default()
662 }
663}
664#[derive(Clone, Debug, Builder, Deserialize)]
669#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
670pub struct GetFlexibleSubscriptionPreviewParams {
671 #[builder(setter(into))]
676 #[serde(rename = "productId")]
677 pub product_id: String,
678 #[builder(setter(into))]
683 #[serde(rename = "amount")]
684 pub amount: rust_decimal::Decimal,
685 #[builder(setter(into), default)]
689 #[serde(rename = "recvWindow", default)]
690 pub recv_window: Option<i64>,
691}
692
693impl GetFlexibleSubscriptionPreviewParams {
694 #[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#[derive(Clone, Debug, Builder, Deserialize, Default)]
716#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
717pub struct GetFlexibleSubscriptionRecordParams {
718 #[builder(setter(into), default)]
723 #[serde(rename = "productId", default)]
724 pub product_id: Option<String>,
725 #[builder(setter(into), default)]
730 #[serde(rename = "purchaseId", default)]
731 pub purchase_id: Option<String>,
732 #[builder(setter(into), default)]
737 #[serde(rename = "asset", default)]
738 pub asset: Option<String>,
739 #[builder(setter(into), default)]
744 #[serde(rename = "startTime", default)]
745 pub start_time: Option<i64>,
746 #[builder(setter(into), default)]
751 #[serde(rename = "endTime", default)]
752 pub end_time: Option<i64>,
753 #[builder(setter(into), default)]
757 #[serde(rename = "current", default)]
758 pub current: Option<i64>,
759 #[builder(setter(into), default)]
763 #[serde(rename = "size", default)]
764 pub size: Option<i64>,
765 #[builder(setter(into), default)]
769 #[serde(rename = "recvWindow", default)]
770 pub recv_window: Option<i64>,
771}
772
773impl GetFlexibleSubscriptionRecordParams {
774 #[must_use]
777 pub fn builder() -> GetFlexibleSubscriptionRecordParamsBuilder {
778 GetFlexibleSubscriptionRecordParamsBuilder::default()
779 }
780}
781#[derive(Clone, Debug, Builder, Deserialize)]
786#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
787pub struct GetLockedPersonalLeftQuotaParams {
788 #[builder(setter(into))]
793 #[serde(rename = "projectId")]
794 pub project_id: String,
795 #[builder(setter(into), default)]
799 #[serde(rename = "recvWindow", default)]
800 pub recv_window: Option<i64>,
801}
802
803impl GetLockedPersonalLeftQuotaParams {
804 #[must_use]
811 pub fn builder(project_id: String) -> GetLockedPersonalLeftQuotaParamsBuilder {
812 GetLockedPersonalLeftQuotaParamsBuilder::default().project_id(project_id)
813 }
814}
815#[derive(Clone, Debug, Builder, Deserialize, Default)]
820#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
821pub struct GetLockedProductPositionParams {
822 #[builder(setter(into), default)]
827 #[serde(rename = "asset", default)]
828 pub asset: Option<String>,
829 #[builder(setter(into), default)]
834 #[serde(rename = "positionId", default)]
835 pub position_id: Option<String>,
836 #[builder(setter(into), default)]
841 #[serde(rename = "projectId", default)]
842 pub project_id: Option<String>,
843 #[builder(setter(into), default)]
847 #[serde(rename = "current", default)]
848 pub current: Option<i64>,
849 #[builder(setter(into), default)]
853 #[serde(rename = "size", default)]
854 pub size: Option<i64>,
855 #[builder(setter(into), default)]
859 #[serde(rename = "recvWindow", default)]
860 pub recv_window: Option<i64>,
861}
862
863impl GetLockedProductPositionParams {
864 #[must_use]
867 pub fn builder() -> GetLockedProductPositionParamsBuilder {
868 GetLockedProductPositionParamsBuilder::default()
869 }
870}
871#[derive(Clone, Debug, Builder, Deserialize, Default)]
876#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
877pub struct GetLockedRedemptionRecordParams {
878 #[builder(setter(into), default)]
883 #[serde(rename = "positionId", default)]
884 pub position_id: Option<String>,
885 #[builder(setter(into), default)]
890 #[serde(rename = "redeemId", default)]
891 pub redeem_id: Option<String>,
892 #[builder(setter(into), default)]
897 #[serde(rename = "asset", default)]
898 pub asset: Option<String>,
899 #[builder(setter(into), default)]
904 #[serde(rename = "startTime", default)]
905 pub start_time: Option<i64>,
906 #[builder(setter(into), default)]
911 #[serde(rename = "endTime", default)]
912 pub end_time: Option<i64>,
913 #[builder(setter(into), default)]
917 #[serde(rename = "current", default)]
918 pub current: Option<i64>,
919 #[builder(setter(into), default)]
923 #[serde(rename = "size", default)]
924 pub size: Option<i64>,
925 #[builder(setter(into), default)]
929 #[serde(rename = "recvWindow", default)]
930 pub recv_window: Option<i64>,
931}
932
933impl GetLockedRedemptionRecordParams {
934 #[must_use]
937 pub fn builder() -> GetLockedRedemptionRecordParamsBuilder {
938 GetLockedRedemptionRecordParamsBuilder::default()
939 }
940}
941#[derive(Clone, Debug, Builder, Deserialize, Default)]
946#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
947pub struct GetLockedRewardsHistoryParams {
948 #[builder(setter(into), default)]
953 #[serde(rename = "positionId", default)]
954 pub position_id: Option<String>,
955 #[builder(setter(into), default)]
960 #[serde(rename = "asset", default)]
961 pub asset: Option<String>,
962 #[builder(setter(into), default)]
967 #[serde(rename = "startTime", default)]
968 pub start_time: Option<i64>,
969 #[builder(setter(into), default)]
974 #[serde(rename = "endTime", default)]
975 pub end_time: Option<i64>,
976 #[builder(setter(into), default)]
980 #[serde(rename = "current", default)]
981 pub current: Option<i64>,
982 #[builder(setter(into), default)]
986 #[serde(rename = "size", default)]
987 pub size: Option<i64>,
988 #[builder(setter(into), default)]
992 #[serde(rename = "recvWindow", default)]
993 pub recv_window: Option<i64>,
994}
995
996impl GetLockedRewardsHistoryParams {
997 #[must_use]
1000 pub fn builder() -> GetLockedRewardsHistoryParamsBuilder {
1001 GetLockedRewardsHistoryParamsBuilder::default()
1002 }
1003}
1004#[derive(Clone, Debug, Builder, Deserialize)]
1009#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1010pub struct GetLockedSubscriptionPreviewParams {
1011 #[builder(setter(into))]
1016 #[serde(rename = "projectId")]
1017 pub project_id: String,
1018 #[builder(setter(into))]
1023 #[serde(rename = "amount")]
1024 pub amount: rust_decimal::Decimal,
1025 #[builder(setter(into), default)]
1029 #[serde(rename = "autoSubscribe", default)]
1030 pub auto_subscribe: Option<bool>,
1031 #[builder(setter(into), default)]
1035 #[serde(rename = "recvWindow", default)]
1036 pub recv_window: Option<i64>,
1037}
1038
1039impl GetLockedSubscriptionPreviewParams {
1040 #[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#[derive(Clone, Debug, Builder, Deserialize, Default)]
1062#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1063pub struct GetLockedSubscriptionRecordParams {
1064 #[builder(setter(into), default)]
1069 #[serde(rename = "purchaseId", default)]
1070 pub purchase_id: Option<String>,
1071 #[builder(setter(into), default)]
1076 #[serde(rename = "asset", default)]
1077 pub asset: Option<String>,
1078 #[builder(setter(into), default)]
1083 #[serde(rename = "startTime", default)]
1084 pub start_time: Option<i64>,
1085 #[builder(setter(into), default)]
1090 #[serde(rename = "endTime", default)]
1091 pub end_time: Option<i64>,
1092 #[builder(setter(into), default)]
1096 #[serde(rename = "current", default)]
1097 pub current: Option<i64>,
1098 #[builder(setter(into), default)]
1102 #[serde(rename = "size", default)]
1103 pub size: Option<i64>,
1104 #[builder(setter(into), default)]
1108 #[serde(rename = "recvWindow", default)]
1109 pub recv_window: Option<i64>,
1110}
1111
1112impl GetLockedSubscriptionRecordParams {
1113 #[must_use]
1116 pub fn builder() -> GetLockedSubscriptionRecordParamsBuilder {
1117 GetLockedSubscriptionRecordParamsBuilder::default()
1118 }
1119}
1120#[derive(Clone, Debug, Builder, Deserialize)]
1125#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1126pub struct GetRateHistoryParams {
1127 #[builder(setter(into))]
1132 #[serde(rename = "productId")]
1133 pub product_id: String,
1134 #[builder(setter(into), default)]
1139 #[serde(rename = "aprPeriod", default)]
1140 pub apr_period: Option<GetRateHistoryAprPeriodEnum>,
1141 #[builder(setter(into), default)]
1146 #[serde(rename = "startTime", default)]
1147 pub start_time: Option<i64>,
1148 #[builder(setter(into), default)]
1153 #[serde(rename = "endTime", default)]
1154 pub end_time: Option<i64>,
1155 #[builder(setter(into), default)]
1159 #[serde(rename = "current", default)]
1160 pub current: Option<i64>,
1161 #[builder(setter(into), default)]
1165 #[serde(rename = "size", default)]
1166 pub size: Option<i64>,
1167 #[builder(setter(into), default)]
1171 #[serde(rename = "recvWindow", default)]
1172 pub recv_window: Option<i64>,
1173}
1174
1175impl GetRateHistoryParams {
1176 #[must_use]
1183 pub fn builder(product_id: String) -> GetRateHistoryParamsBuilder {
1184 GetRateHistoryParamsBuilder::default().product_id(product_id)
1185 }
1186}
1187#[derive(Clone, Debug, Builder, Deserialize, Default)]
1192#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1193pub struct GetSimpleEarnFlexibleProductListParams {
1194 #[builder(setter(into), default)]
1199 #[serde(rename = "asset", default)]
1200 pub asset: Option<String>,
1201 #[builder(setter(into), default)]
1205 #[serde(rename = "current", default)]
1206 pub current: Option<i64>,
1207 #[builder(setter(into), default)]
1211 #[serde(rename = "size", default)]
1212 pub size: Option<i64>,
1213 #[builder(setter(into), default)]
1217 #[serde(rename = "recvWindow", default)]
1218 pub recv_window: Option<i64>,
1219}
1220
1221impl GetSimpleEarnFlexibleProductListParams {
1222 #[must_use]
1225 pub fn builder() -> GetSimpleEarnFlexibleProductListParamsBuilder {
1226 GetSimpleEarnFlexibleProductListParamsBuilder::default()
1227 }
1228}
1229#[derive(Clone, Debug, Builder, Deserialize, Default)]
1234#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1235pub struct GetSimpleEarnLockedProductListParams {
1236 #[builder(setter(into), default)]
1241 #[serde(rename = "asset", default)]
1242 pub asset: Option<String>,
1243 #[builder(setter(into), default)]
1247 #[serde(rename = "current", default)]
1248 pub current: Option<i64>,
1249 #[builder(setter(into), default)]
1253 #[serde(rename = "size", default)]
1254 pub size: Option<i64>,
1255 #[builder(setter(into), default)]
1259 #[serde(rename = "recvWindow", default)]
1260 pub recv_window: Option<i64>,
1261}
1262
1263impl GetSimpleEarnLockedProductListParams {
1264 #[must_use]
1267 pub fn builder() -> GetSimpleEarnLockedProductListParamsBuilder {
1268 GetSimpleEarnLockedProductListParamsBuilder::default()
1269 }
1270}
1271#[derive(Clone, Debug, Builder, Deserialize)]
1276#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1277pub struct RedeemFlexibleProductParams {
1278 #[builder(setter(into))]
1283 #[serde(rename = "productId")]
1284 pub product_id: String,
1285 #[builder(setter(into), default)]
1290 #[serde(rename = "redeemAll", default)]
1291 pub redeem_all: Option<bool>,
1292 #[builder(setter(into), default)]
1296 #[serde(rename = "amount", default)]
1297 pub amount: Option<rust_decimal::Decimal>,
1298 #[builder(setter(into), default)]
1303 #[serde(rename = "destAccount", default)]
1304 pub dest_account: Option<RedeemFlexibleProductDestAccountEnum>,
1305 #[builder(setter(into), default)]
1309 #[serde(rename = "recvWindow", default)]
1310 pub recv_window: Option<i64>,
1311}
1312
1313impl RedeemFlexibleProductParams {
1314 #[must_use]
1321 pub fn builder(product_id: String) -> RedeemFlexibleProductParamsBuilder {
1322 RedeemFlexibleProductParamsBuilder::default().product_id(product_id)
1323 }
1324}
1325#[derive(Clone, Debug, Builder, Deserialize)]
1330#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1331pub struct RedeemLockedProductParams {
1332 #[builder(setter(into))]
1336 #[serde(rename = "positionId")]
1337 pub position_id: String,
1338 #[builder(setter(into), default)]
1342 #[serde(rename = "recvWindow", default)]
1343 pub recv_window: Option<i64>,
1344}
1345
1346impl RedeemLockedProductParams {
1347 #[must_use]
1354 pub fn builder(position_id: String) -> RedeemLockedProductParamsBuilder {
1355 RedeemLockedProductParamsBuilder::default().position_id(position_id)
1356 }
1357}
1358#[derive(Clone, Debug, Builder, Deserialize)]
1363#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1364pub struct SetFlexibleAutoSubscribeParams {
1365 #[builder(setter(into))]
1370 #[serde(rename = "productId")]
1371 pub product_id: String,
1372 #[builder(setter(into))]
1377 #[serde(rename = "autoSubscribe")]
1378 pub auto_subscribe: bool,
1379 #[builder(setter(into), default)]
1383 #[serde(rename = "recvWindow", default)]
1384 pub recv_window: Option<i64>,
1385}
1386
1387impl SetFlexibleAutoSubscribeParams {
1388 #[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#[derive(Clone, Debug, Builder, Deserialize)]
1410#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1411pub struct SetLockedAutoSubscribeParams {
1412 #[builder(setter(into))]
1417 #[serde(rename = "positionId")]
1418 pub position_id: String,
1419 #[builder(setter(into))]
1424 #[serde(rename = "autoSubscribe")]
1425 pub auto_subscribe: bool,
1426 #[builder(setter(into), default)]
1430 #[serde(rename = "recvWindow", default)]
1431 pub recv_window: Option<i64>,
1432}
1433
1434impl SetLockedAutoSubscribeParams {
1435 #[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#[derive(Clone, Debug, Builder, Deserialize)]
1457#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1458pub struct SetLockedProductRedeemOptionParams {
1459 #[builder(setter(into))]
1464 #[serde(rename = "positionId")]
1465 pub position_id: String,
1466 #[builder(setter(into))]
1471 #[serde(rename = "redeemTo")]
1472 pub redeem_to: SetLockedProductRedeemOptionRedeemToEnum,
1473 #[builder(setter(into), default)]
1477 #[serde(rename = "recvWindow", default)]
1478 pub recv_window: Option<i64>,
1479}
1480
1481impl SetLockedProductRedeemOptionParams {
1482 #[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#[derive(Clone, Debug, Builder, Deserialize, Default)]
1504#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1505pub struct SimpleAccountParams {
1506 #[builder(setter(into), default)]
1510 #[serde(rename = "recvWindow", default)]
1511 pub recv_window: Option<i64>,
1512}
1513
1514impl SimpleAccountParams {
1515 #[must_use]
1518 pub fn builder() -> SimpleAccountParamsBuilder {
1519 SimpleAccountParamsBuilder::default()
1520 }
1521}
1522#[derive(Clone, Debug, Builder, Deserialize)]
1527#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1528pub struct SubscribeFlexibleProductParams {
1529 #[builder(setter(into))]
1534 #[serde(rename = "productId")]
1535 pub product_id: String,
1536 #[builder(setter(into))]
1541 #[serde(rename = "amount")]
1542 pub amount: rust_decimal::Decimal,
1543 #[builder(setter(into), default)]
1548 #[serde(rename = "autoSubscribe", default)]
1549 pub auto_subscribe: Option<bool>,
1550 #[builder(setter(into), default)]
1555 #[serde(rename = "sourceAccount", default)]
1556 pub source_account: Option<SubscribeFlexibleProductSourceAccountEnum>,
1557 #[builder(setter(into), default)]
1561 #[serde(rename = "recvWindow", default)]
1562 pub recv_window: Option<i64>,
1563}
1564
1565impl SubscribeFlexibleProductParams {
1566 #[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#[derive(Clone, Debug, Builder, Deserialize)]
1588#[builder(pattern = "owned", build_fn(error = "ParamBuildError"))]
1589pub struct SubscribeLockedProductParams {
1590 #[builder(setter(into))]
1595 #[serde(rename = "projectId")]
1596 pub project_id: String,
1597 #[builder(setter(into))]
1602 #[serde(rename = "amount")]
1603 pub amount: rust_decimal::Decimal,
1604 #[builder(setter(into), default)]
1609 #[serde(rename = "autoSubscribe", default)]
1610 pub auto_subscribe: Option<bool>,
1611 #[builder(setter(into), default)]
1616 #[serde(rename = "sourceAccount", default)]
1617 pub source_account: Option<SubscribeLockedProductSourceAccountEnum>,
1618 #[builder(setter(into), default)]
1623 #[serde(rename = "redeemTo", default)]
1624 pub redeem_to: Option<SubscribeLockedProductRedeemToEnum>,
1625 #[builder(setter(into), default)]
1629 #[serde(rename = "recvWindow", default)]
1630 pub recv_window: Option<i64>,
1631}
1632
1633impl SubscribeLockedProductParams {
1634 #[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}