use super::super::Binance;
use super::super::signed_request::HttpMethod;
use ccxt_core::{Error, ParseError, Result};
use serde_json::Value;
impl Binance {
pub async fn set_position_mode_dapi(
&self,
dual_side: bool,
params: Option<Value>,
) -> Result<Value> {
let url = format!("{}/positionSide/dual", self.urls().dapi_private);
self.signed_request(url)
.method(HttpMethod::Post)
.param("dualSidePosition", dual_side)
.merge_json_params(params)
.execute()
.await
}
pub async fn fetch_position_mode_dapi(&self, params: Option<Value>) -> Result<bool> {
let url = format!("{}/positionSide/dual", self.urls().dapi_private);
let data = self
.signed_request(url)
.merge_json_params(params)
.execute()
.await?;
if let Some(dual_side) = data.get("dualSidePosition") {
if let Some(value) = dual_side.as_bool() {
return Ok(value);
}
if let Some(value_str) = dual_side.as_str() {
return Ok(value_str.to_lowercase() == "true");
}
}
Err(Error::from(ParseError::invalid_format(
"data",
"Failed to parse DAPI position mode response: missing or invalid dualSidePosition field",
)))
}
pub async fn fetch_dapi_account(&self, params: Option<Value>) -> Result<Value> {
let url = format!("{}/account", self.urls().dapi_private);
let data = self
.signed_request(url)
.merge_json_params(params)
.execute()
.await?;
if let Some(code) = data.get("code") {
if let Some(msg) = data.get("msg") {
return Err(Error::exchange(
code.to_string(),
msg.as_str().unwrap_or("Unknown error").to_string(),
));
}
}
Ok(data)
}
pub async fn fetch_dapi_income(
&self,
symbol: Option<&str>,
income_type: Option<&str>,
since: Option<i64>,
limit: Option<u32>,
params: Option<Value>,
) -> Result<Value> {
let url = format!("{}/income", self.urls().dapi_private);
let mut builder = self.signed_request(url);
if let Some(sym) = symbol {
self.load_markets(false).await?;
let market = self.base().market(sym).await?;
builder = builder.param("symbol", &market.id);
}
if let Some(income_t) = income_type {
builder = builder.param("incomeType", income_t);
}
let data = builder
.optional_param("startTime", since)
.optional_param("limit", limit)
.merge_json_params(params)
.execute()
.await?;
if let Some(code) = data.get("code") {
if let Some(msg) = data.get("msg") {
return Err(Error::exchange(
code.to_string(),
msg.as_str().unwrap_or("Unknown error").to_string(),
));
}
}
Ok(data)
}
pub async fn fetch_dapi_commission_rate(
&self,
symbol: &str,
params: Option<Value>,
) -> Result<Value> {
self.load_markets(false).await?;
let market = self.base().market(symbol).await?;
let url = format!("{}/commissionRate", self.urls().dapi_private);
let data = self
.signed_request(url)
.param("symbol", &market.id)
.merge_json_params(params)
.execute()
.await?;
if let Some(code) = data.get("code") {
if let Some(msg) = data.get("msg") {
return Err(Error::exchange(
code.to_string(),
msg.as_str().unwrap_or("Unknown error").to_string(),
));
}
}
Ok(data)
}
pub async fn fetch_dapi_adl_quantile(
&self,
symbol: Option<&str>,
params: Option<Value>,
) -> Result<Value> {
let url = format!("{}/adlQuantile", self.urls().dapi_private);
let mut builder = self.signed_request(url);
if let Some(sym) = symbol {
self.load_markets(false).await?;
let market = self.base().market(sym).await?;
builder = builder.param("symbol", &market.id);
}
let data = builder.merge_json_params(params).execute().await?;
if let Some(code) = data.get("code") {
if let Some(msg) = data.get("msg") {
return Err(Error::exchange(
code.to_string(),
msg.as_str().unwrap_or("Unknown error").to_string(),
));
}
}
Ok(data)
}
pub async fn fetch_dapi_force_orders(
&self,
symbol: Option<&str>,
auto_close_type: Option<&str>,
since: Option<i64>,
limit: Option<u32>,
params: Option<Value>,
) -> Result<Value> {
let url = format!("{}/forceOrders", self.urls().dapi_private);
let mut builder = self.signed_request(url);
if let Some(sym) = symbol {
self.load_markets(false).await?;
let market = self.base().market(sym).await?;
builder = builder.param("symbol", &market.id);
}
if let Some(close_type) = auto_close_type {
builder = builder.param("autoCloseType", close_type);
}
let data = builder
.optional_param("startTime", since)
.optional_param("limit", limit)
.merge_json_params(params)
.execute()
.await?;
if let Some(code) = data.get("code") {
if let Some(msg) = data.get("msg") {
return Err(Error::exchange(
code.to_string(),
msg.as_str().unwrap_or("Unknown error").to_string(),
));
}
}
Ok(data)
}
}