use std::collections::HashMap;
use super::super::utils::http_get;
use crate::error::{Error, Result};
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Clone, Serialize, Deserialize)]
#[allow(non_snake_case)]
struct SwapMarket {
contractId: String, symbol: String, settleAnchor: String, quoteAnchor: String, contractAnchor: String, contractValue: String, pair: String, expiry: String, maxLeverage: String, maintanceMargin: String, makerFee: String, takerFee: String, settleFee: String, priceDec: String, anchorDec: String, status: String, isreverse: String, allowCross: String, allowLeverages: String, maxOrderNum: String, maxAmount: String, minAmount: String, maxPositionAmount: String, #[serde(flatten)]
extra: HashMap<String, Value>,
}
#[derive(Serialize, Deserialize)]
struct Response {
status: i64,
msg: String,
data: Vec<SwapMarket>,
time: i64,
microtime: String,
source: String,
}
fn fetch_swap_markets_raw() -> Result<Vec<SwapMarket>> {
let txt = http_get("https://apiv2.bitz.com/V2/Market/getContractCoin", None)?;
let resp = serde_json::from_str::<Response>(&txt)?;
if resp.status != 200 {
Err(Error(txt))
} else {
let markets: Vec<SwapMarket> = resp.data.into_iter().filter(|x| x.status == "1").collect();
Ok(markets)
}
}
pub(super) fn fetch_inverse_swap_symbols() -> Result<Vec<String>> {
let symbols = fetch_swap_markets_raw()?
.into_iter()
.filter(|m| m.isreverse == "1")
.map(|m| m.pair)
.collect::<Vec<String>>();
Ok(symbols)
}
pub(super) fn fetch_linear_swap_symbols() -> Result<Vec<String>> {
let symbols = fetch_swap_markets_raw()?
.into_iter()
.filter(|m| m.isreverse == "-1" && m.settleAnchor == "USDT")
.map(|m| m.pair)
.collect::<Vec<String>>();
Ok(symbols)
}