|
|
@@ -12,7 +12,7 @@ use std::collections::{HashMap, HashSet};
|
|
|
use backtrace::Backtrace;
|
|
|
use std::sync::Arc;
|
|
|
use std::sync::atomic::{AtomicBool, Ordering};
|
|
|
-use anyhow::anyhow;
|
|
|
+use anyhow::{anyhow, Context};
|
|
|
use anyhow::Result;
|
|
|
use serde_json::Value;
|
|
|
use tracing::{error, info, warn};
|
|
|
@@ -120,52 +120,28 @@ pub async fn run_mexc_subscriptions(
|
|
|
let default_symbols_response = rest_client.default_symbols().await;
|
|
|
// info!("获取到的 default_symbols_value: {}", serde_json::to_string_pretty(&default_symbols_response.data).unwrap());
|
|
|
|
|
|
- let exchange_info_response = rest_client.exchange_info(serde_json::Value::Null).await;
|
|
|
+ let exchange_info_response = rest_client.exchange_info(Value::Null).await;
|
|
|
// info!("获取到的 exchange_info_data: {}", serde_json::to_string_pretty(&exchange_info_response.data).unwrap());
|
|
|
- // 调用处理函数,注意现在传入的是 &Value
|
|
|
-
|
|
|
- match process_exchange_info(&default_symbols_response.data, &exchange_info_response.data) {
|
|
|
- Ok(filtered_map) => {
|
|
|
- info!("成功过滤并转换了交易对信息,最终数量: {}", filtered_map.len());
|
|
|
-
|
|
|
- // 使用 filtered_map...
|
|
|
- if let Some(symbol_info) = filtered_map.get("BTCUSDT") { // 示例
|
|
|
- let pretty_info = serde_json::to_string_pretty(symbol_info).unwrap_or_else(|e| format!("序列化错误: {}", e));
|
|
|
- info!("BTCUSDT 的信息: {}", pretty_info);
|
|
|
- } else if !filtered_map.is_empty() {
|
|
|
- if let Some((first_key, first_value)) = filtered_map.iter().next() {
|
|
|
- let pretty_info = serde_json::to_string_pretty(first_value).unwrap_or_else(|e| format!("序列化错误: {}", e));
|
|
|
- info!("过滤后 map 中的第一个交易对 '{}' 的信息: {}", first_key, pretty_info);
|
|
|
- }
|
|
|
- } else {
|
|
|
- info!("过滤后的 Map 为空。");
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- Err(e) => {
|
|
|
- error!("处理交易所信息时发生错误: {}", e);
|
|
|
- return Err(e);
|
|
|
+
|
|
|
+ // 调用过滤函数,注意现在传入的是 &Value
|
|
|
+ let filtered_map = process_exchange_info(&default_symbols_response.data, &exchange_info_response.data)
|
|
|
+ .context("处理交易所信息时发生错误")?;
|
|
|
+ info!("成功过滤并转换了交易对信息,最终数量: {}", filtered_map.len());
|
|
|
+ // 使用 filtered_map...
|
|
|
+ if let Some(symbol_info) = filtered_map.get("BTCUSDT") { // 示例
|
|
|
+ let pretty_info = serde_json::to_string_pretty(symbol_info).unwrap_or_else(|e| format!("序列化错误: {}", e));
|
|
|
+ info!("BTCUSDT 的信息: {}", pretty_info);
|
|
|
+ } else if !filtered_map.is_empty() {
|
|
|
+ if let Some((first_key, first_value)) = filtered_map.iter().next() {
|
|
|
+ let pretty_info = serde_json::to_string_pretty(first_value).unwrap_or_else(|e| format!("序列化错误: {}", e));
|
|
|
+ info!("过滤后 map 中的第一个交易对 '{}' 的信息: {}", first_key, pretty_info);
|
|
|
}
|
|
|
+ } else {
|
|
|
+ return Err(anyhow!("未能获取到任何有效的交易对,请检查网络或 API 接口。"));
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- // // 提取交易对名称 (例如 "BTC_USDT")
|
|
|
- // // 假设 SymbolInfo 结构体有一个名为 `symbol` 的 String 字段
|
|
|
- // // 同时,我们可能需要过滤掉一些不活跃或不交易的交易对(根据API返回的状态字段)
|
|
|
- // let symbols: Vec<String> = symbols_info
|
|
|
- // .iter()
|
|
|
- // // .filter(|info| info.status == "ENABLED") // 假设有状态字段可以过滤
|
|
|
- // .map(|info| info.symbol.clone()) // 假设字段名为 symbol
|
|
|
- // .collect();
|
|
|
- //
|
|
|
- // if symbols.is_empty() {
|
|
|
- // warn!("未能获取到任何有效的交易对,请检查网络或 API 接口。");
|
|
|
- // // 根据情况决定是否需要停止程序
|
|
|
- // // running.store(false, Ordering::Relaxed);
|
|
|
- // return false; // 或者返回特定错误
|
|
|
- // }
|
|
|
- //
|
|
|
- // info!("成功获取 {} 个交易对,准备订阅 1 分钟 K 线...", symbols.len());
|
|
|
+ let symbols: Vec<String> = filtered_map.keys().cloned().collect();
|
|
|
+ info!("成功获取 {} 个交易对,准备订阅 1 分钟 K 线...", symbols.len());
|
|
|
|
|
|
// // 2. 按规则订阅所有交易对的 1Min K 线
|
|
|
// // WsManager 应该负责处理如何将这些订阅分散到多个 WebSocket 连接上
|