futu_qot/
snapshot.rs

1use futu_core::error::{FutuError, Result};
2use futu_core::proto_id;
3use futu_net::client::FutuClient;
4
5use crate::types::Security;
6
7/// 获取股票快照(原始 proto 响应)
8///
9/// 返回 `Qot_GetSecuritySnapshot::S2C`,因为 Snapshot 结构较复杂
10/// (含正股/窝轮/期权/期货等不同额外数据),直接暴露 proto 类型。
11pub async fn get_security_snapshot(
12    client: &FutuClient,
13    securities: &[Security],
14) -> Result<futu_proto::qot_get_security_snapshot::S2c> {
15    let req = futu_proto::qot_get_security_snapshot::Request {
16        c2s: futu_proto::qot_get_security_snapshot::C2s {
17            security_list: securities.iter().map(|s| s.to_proto()).collect(),
18        },
19    };
20
21    let body = prost::Message::encode_to_vec(&req);
22    let resp_frame = client
23        .request(proto_id::QOT_GET_SECURITY_SNAPSHOT, body)
24        .await?;
25
26    let resp: futu_proto::qot_get_security_snapshot::Response =
27        prost::Message::decode(resp_frame.body.as_ref()).map_err(FutuError::Proto)?;
28
29    if resp.ret_type != 0 {
30        return Err(FutuError::ServerError {
31            ret_type: resp.ret_type,
32            msg: resp.ret_msg.unwrap_or_default(),
33        });
34    }
35
36    resp.s2c.ok_or(FutuError::Codec(
37        "missing s2c in GetSecuritySnapshot".into(),
38    ))
39}