Skip to main content

futucli/cmd/
ping.rs

1//! `futucli ping` — 探活
2
3use std::time::Instant;
4
5use anyhow::Result;
6
7use crate::common::connect_gateway;
8use crate::output::OutputFormat;
9
10#[derive(serde::Serialize, tabled::Tabled)]
11struct PingRow {
12    field: String,
13    value: String,
14}
15
16#[derive(serde::Serialize)]
17struct PingJson {
18    gateway: String,
19    connect_ms: f64,
20    rtt_ms: f64,
21    ok: bool,
22}
23
24/// v1.4.98 eli BUG-005 fix (P2, 2026-04-27): ping 之前 println! 硬编码文本不
25/// 接 OutputFormat. 加 format 参数让 `-o json` 真生效 (脚本/agent 用).
26pub async fn run(gateway: &str, format: OutputFormat) -> Result<()> {
27    let start = Instant::now();
28    let (client, _push_rx) = connect_gateway(gateway, "futucli-ping").await?;
29    let connect_ms = start.elapsed().as_secs_f64() * 1000.0;
30
31    // 做一次最轻量的请求:GetSubInfo(不订阅任何东西)
32    let req_start = Instant::now();
33    let _ = futu_qot::market_misc::get_sub_info(&client, false).await?;
34    let rtt_ms = req_start.elapsed().as_secs_f64() * 1000.0;
35
36    let rows = vec![
37        PingRow {
38            field: "gateway".into(),
39            value: gateway.to_string(),
40        },
41        PingRow {
42            field: "connect_ms".into(),
43            value: format!("{connect_ms:.2}"),
44        },
45        PingRow {
46            field: "rtt_ms".into(),
47            value: format!("{rtt_ms:.2}"),
48        },
49    ];
50    let json = PingJson {
51        gateway: gateway.to_string(),
52        connect_ms,
53        rtt_ms,
54        ok: true,
55    };
56    format.print_rows(&rows, &[json])?;
57    Ok(())
58}