1use 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
24pub 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 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}