binance_swap_standard.rs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. use std::io::{Error, ErrorKind};
  2. use rust_decimal::Decimal;
  3. use serde::{Deserialize, Serialize};
  4. use crate::binance_swap::binance_swap_rest::{get_agg_trades, get_trades};
  5. use crate::struct_standard::{AggTrades, Trades};
  6. use crate::utils::utils::format_symbol;
  7. #[derive(Debug, Deserialize, Serialize)]
  8. #[serde(rename_all = "camelCase")]
  9. struct SwapTrades {
  10. id: i64,
  11. price: String,
  12. qty: Decimal,
  13. quote_qty: String,
  14. time: i64,
  15. is_buyer_maker: bool,
  16. }
  17. #[derive(Debug, Deserialize, Serialize)]
  18. #[serde(rename_all = "camelCase")]
  19. struct SwapAggTrades {
  20. a: i64,
  21. p: String,
  22. q: Decimal,
  23. f: i64,
  24. l: i64,
  25. #[serde(rename = "T")]
  26. t: i64,
  27. m: bool,
  28. }
  29. pub(crate) async fn standard_agg_trades(symbol: &str, start_at: &str, end_at: &str, trade_id: &str) -> Result<Vec<AggTrades>, Error> {
  30. let symbol_fmt = format_symbol(symbol, "");
  31. let start_at_milli = if start_at != "" { format!("{}{}", start_at, "000") } else { "".to_string() };
  32. let end_at_milli = if end_at != "" { format!("{}{}", end_at, "000") } else { "".to_string() };
  33. let res_data = get_agg_trades(&symbol_fmt, &start_at_milli, &end_at_milli, trade_id).await;
  34. if res_data.code == "200" {
  35. let res_data_str = res_data.data;
  36. let trades_list: Vec<SwapAggTrades> = serde_json::from_str(&res_data_str).unwrap();
  37. let result = trades_list.iter().map(|item| {
  38. AggTrades {
  39. id: item.a.to_string(),
  40. start_id: item.f.to_string(),
  41. end_id: item.l.to_string(),
  42. symbol: symbol.to_string(),
  43. create_time: item.t.to_string(),
  44. size: if item.m { format!("-{}", item.q.to_string()) } else { item.q.to_string() },
  45. price: item.p.clone(),
  46. }
  47. }).collect();
  48. Ok(result)
  49. } else {
  50. Err(Error::new(ErrorKind::Other, res_data.to_string()))
  51. }
  52. }
  53. #[allow(dead_code)]
  54. pub async fn standard_trades(symbol: &str, limit: &str, trade_id: &str) -> Result<Vec<Trades>, Error> {
  55. let symbol_fmt = format_symbol(symbol, "");
  56. let res_data = get_trades(&symbol_fmt, limit, trade_id).await;
  57. if res_data.code == "200" {
  58. let res_data_str = res_data.data;
  59. let trades_list: Vec<SwapTrades> = serde_json::from_str(&res_data_str).unwrap();
  60. let result = trades_list.iter().map(|item| {
  61. Trades {
  62. id: item.id.to_string(),
  63. data_type: "ticker_binance".to_string(),
  64. symbol: symbol.to_string(),
  65. create_time: item.time.to_string(),
  66. size: if item.is_buyer_maker { item.qty.to_string() } else { format!("-{}", item.qty.to_string()) },
  67. price: item.price.clone(),
  68. side: if item.is_buyer_maker { "BUY".to_string() } else { "SELL".to_string() },
  69. is_effect: true,
  70. }
  71. }).collect();
  72. Ok(result)
  73. } else {
  74. Err(Error::new(ErrorKind::Other, res_data.to_string()))
  75. }
  76. }