Skip to main content

rust_okx/ws/response/
mod.rs

1//! Typed top-level OKX WebSocket response bodies.
2//!
3//! [`crate::ws::WsEvent`] keeps channel and operation data as raw bytes until a
4//! caller chooses a row type. These envelopes support direct Serde decoding.
5
6mod acknowledgement;
7mod operation;
8mod push;
9mod spread;
10mod trade;
11
12use std::collections::BTreeMap;
13
14use serde_json::Value;
15
16/// Unrecognized top-level response fields retained for forward compatibility.
17pub type ResponseExtraFields = BTreeMap<String, Value>;
18
19pub use acknowledgement::{
20    ChannelAcknowledgement, ChannelConnectionCountResponse, LoginAcknowledgement, NoticeResponse,
21};
22pub use operation::OperationResponse;
23pub use push::PushResponse;
24pub use spread::{
25    AmendSpreadOrderResponse, CancelSpreadOrderResponse, MassCancelSpreadOrdersResponse,
26    PlaceSpreadOrderResponse,
27};
28pub use trade::{
29    AmendOrderResponse, CancelOrderResponse, MassCancelOrdersResponse, PlaceOrderResponse,
30};
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35    use crate::ws::model::TickerUpdate;
36
37    #[test]
38    fn parses_complete_channel_push_envelope() {
39        let response: PushResponse<TickerUpdate> = serde_json::from_str(
40            r#"{"arg":{"channel":"tickers","instId":"BTC-USDT"},"data":[{"instType":"SPOT","instId":"BTC-USDT","last":"1","ts":"2"}]}"#,
41        )
42        .unwrap();
43        assert_eq!(response.arg.channel, "tickers");
44        assert_eq!(response.data[0].inst_id, "BTC-USDT");
45    }
46
47    #[test]
48    fn parses_login_acknowledgement_metadata() {
49        let response: LoginAcknowledgement =
50            serde_json::from_str(r#"{"event":"login","code":"0","msg":"","connId":"abc"}"#)
51                .unwrap();
52        assert_eq!(response.code, "0");
53        assert_eq!(response.conn_id, "abc");
54    }
55}