use serde::{Deserialize, Serialize};
use crate::common::enums::{BinanceFilterType, BinanceRateLimitInterval, BinanceRateLimitType};
#[derive(Clone, Debug, Deserialize)]
pub struct BinanceErrorResponse {
pub code: i64,
pub msg: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SpotPriceFilter {
pub filter_type: BinanceFilterType,
pub min_price: String,
pub max_price: String,
pub tick_size: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SpotLotSizeFilter {
pub filter_type: BinanceFilterType,
pub min_qty: String,
pub max_qty: String,
pub step_size: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SpotMarketLotSizeFilter {
pub filter_type: BinanceFilterType,
pub min_qty: String,
pub max_qty: String,
pub step_size: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SpotNotionalFilter {
pub filter_type: BinanceFilterType,
pub min_notional: String,
#[serde(default)]
pub apply_min_to_market: Option<bool>,
#[serde(default)]
pub max_notional: Option<String>,
#[serde(default)]
pub apply_max_to_market: Option<bool>,
#[serde(default)]
pub avg_price_mins: Option<i64>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SpotPercentPriceFilter {
pub filter_type: BinanceFilterType,
pub multiplier_up: String,
pub multiplier_down: String,
#[serde(default)]
pub avg_price_mins: Option<i64>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FuturesPriceFilter {
pub filter_type: BinanceFilterType,
pub min_price: String,
pub max_price: String,
pub tick_size: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FuturesLotSizeFilter {
pub filter_type: BinanceFilterType,
pub max_qty: String,
pub min_qty: String,
pub step_size: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FuturesMarketLotSizeFilter {
pub filter_type: BinanceFilterType,
pub max_qty: String,
pub min_qty: String,
pub step_size: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FuturesMinNotionalFilter {
pub filter_type: BinanceFilterType,
pub notional: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FuturesPercentPriceFilter {
pub filter_type: BinanceFilterType,
pub multiplier_up: String,
pub multiplier_down: String,
#[serde(default)]
pub multiplier_decimal: Option<String>,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MaxNumOrdersFilter {
pub filter_type: BinanceFilterType,
pub limit: i64,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MaxNumAlgoOrdersFilter {
pub filter_type: BinanceFilterType,
pub limit: i64,
}
#[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BinanceRateLimit {
pub rate_limit_type: BinanceRateLimitType,
pub interval: BinanceRateLimitInterval,
pub interval_num: i64,
pub limit: i64,
}
#[cfg(test)]
mod tests {
use rstest::rstest;
use super::*;
#[rstest]
fn test_binance_rate_limit_deserializes_known_values() {
let json = r#"{
"rateLimitType": "REQUEST_WEIGHT",
"interval": "MINUTE",
"intervalNum": 1,
"limit": 2400
}"#;
let rate_limit: BinanceRateLimit = serde_json::from_str(json).unwrap();
assert_eq!(
rate_limit.rate_limit_type,
BinanceRateLimitType::RequestWeight
);
assert_eq!(rate_limit.interval, BinanceRateLimitInterval::Minute);
assert_eq!(rate_limit.interval_num, 1);
assert_eq!(rate_limit.limit, 2400);
}
#[rstest]
fn test_binance_rate_limit_deserializes_unknown_values() {
let json = r#"{
"rateLimitType": "UNKNOWN_LIMIT",
"interval": "WEEK",
"intervalNum": 7,
"limit": 99
}"#;
let rate_limit: BinanceRateLimit = serde_json::from_str(json).unwrap();
assert_eq!(rate_limit.rate_limit_type, BinanceRateLimitType::Unknown);
assert_eq!(rate_limit.interval, BinanceRateLimitInterval::Unknown);
assert_eq!(rate_limit.interval_num, 7);
assert_eq!(rate_limit.limit, 99);
}
}