use ccxt_core::types::default_type::{DefaultSubType, DefaultType};
use serde::{Deserialize, Deserializer, Serialize};
use std::str::FromStr;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BinanceOptions {
pub adjust_for_time_difference: bool,
pub recv_window: u64,
#[serde(deserialize_with = "deserialize_default_type")]
pub default_type: DefaultType,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub default_sub_type: Option<DefaultSubType>,
pub test: bool,
#[serde(default = "default_sync_interval")]
pub time_sync_interval_secs: u64,
#[serde(default = "default_auto_sync")]
pub auto_time_sync: bool,
#[serde(default = "default_rate_limit")]
pub rate_limit: u32,
}
fn default_sync_interval() -> u64 {
30
}
fn default_auto_sync() -> bool {
true
}
fn default_rate_limit() -> u32 {
50
}
fn deserialize_default_type<'de, D>(deserializer: D) -> std::result::Result<DefaultType, D::Error>
where
D: Deserializer<'de>,
{
use serde::de::Error;
#[derive(Deserialize)]
#[serde(untagged)]
enum StringOrDefaultType {
String(String),
DefaultType(DefaultType),
}
match StringOrDefaultType::deserialize(deserializer)? {
StringOrDefaultType::String(s) => {
let lowercase = s.to_lowercase();
let normalized = match lowercase.as_str() {
"future" => "swap", "delivery" => "futures", _ => lowercase.as_str(),
};
DefaultType::from_str(normalized).map_err(|e| D::Error::custom(e.to_string()))
}
StringOrDefaultType::DefaultType(dt) => Ok(dt),
}
}
impl Default for BinanceOptions {
fn default() -> Self {
Self {
adjust_for_time_difference: false,
recv_window: 5000,
default_type: DefaultType::default(), default_sub_type: None,
test: false,
time_sync_interval_secs: default_sync_interval(),
auto_time_sync: default_auto_sync(),
rate_limit: default_rate_limit(),
}
}
}