use adapters::Client;
use serde_with::{DisplayFromStr, serde_as};
use v_exchanges_adapters::binance::{BinanceHttpUrl, BinanceOption};
use v_utils::prelude::*;
use crate::ExchangeResult;
pub async fn prices(client: &Client, pairs: Option<Vec<Pair>>) -> ExchangeResult<BTreeMap<Pair, f64>> {
let options = vec![BinanceOption::HttpUrl(BinanceHttpUrl::FuturesUsdM)];
let rs: Vec<PriceObject> = match pairs {
Some(pairs) => {
let symbols_json = serde_json::to_string(&pairs.iter().map(|p| p.fmt_binance()).collect::<Vec<_>>()).expect("Vec<String> always serializes");
let params = json!({ "symbols": symbols_json });
client.get("/fapi/v1/ticker/price", ¶ms, options).await?
}
None => client.get_no_query("/fapi/v2/ticker/price", options).await?,
};
Ok(rs.into_iter().map(Into::into).collect())
}
#[serde_as]
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
struct PriceObject {
#[serde_as(as = "DisplayFromStr")]
price: f64,
symbol: String,
time: i64,
}
impl From<PriceObject> for (Pair, f64) {
fn from(p: PriceObject) -> Self {
(Pair::from_str(&p.symbol).expect("Assume v_utils can handle all Binance pairs"), p.price)
}
}